/*
* Copyright (c) 2006 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:  Implementation of Collection view
*
*/

// INCLUDE FILES
#include <bldvariant.hrh>
#include <f32file.h>
#include <eikmenub.h>
#include <coeutils.h>
#include <aknlists.h>
#include <aknViewAppUi.h>
#include <AknQueryDialog.h>
#include <StringLoader.h>
#include <aknnavilabel.h>
#include <aknnavide.h>
#include <akntitle.h>
#include <textresolver.h>
#include <aknnotewrappers.h>
#include <aknnavi.h>
#include <hlplch.h>
#include <avkon.hrh>
#include <avkon.rsg>
#include <avkon.mbg>
#include <sendui.h>
#include <CMessageData.h>
#include <centralrepository.h>
#include <mprofileengine.h>
#include <akndlgshut.h>
#ifdef RD_MULTIPLE_DRIVE
#include <driveinfo.h>
#endif //RD_MULTIPLE_DRIVE

#include <upnpcopycommand.h>
#include <AiwServiceHandler.h>  //Copy to remote feature

#include <mediarecognizer.h>
#include <featmgr.h>
#include <aknmediatorfacade.h>
#include <MediatorCommandInitiator.h>
#include <mediatordomainuids.h>

#include <mplayersecondarydisplayapi.h>
#include <data_caging_path_literals.hrh>
#include <layoutmetadata.cdl.h>
#include <mpxplaybackframeworkdefs.h>
#include <mpxcollectionmessage.h>
#include <mpxviewutility.h>
#include <mpxmusicplayerviewplugin.hrh>
#include <mpxcollectionviewhg.rsg>
#include <mpxcollectionviewhg.mbg>
#include <mpxcommonui.rsg>
#include <mpxcollectionutility.h>
#include <mpxplaybackutility.h>
#include <mpxplaybackmessage.h>
#include <mpxmedia.h>
#include <mpxcollectionhelperfactory.h>
#include <mpxcollectionplaylist.h>
#include <mpxmediacontainerdefs.h>
#include <mpxmediamusicdefs.h>
#include <mpxmediacollectiondetaildefs.h>
#include <mpxmediadrmdefs.h>
#include <mpxmediaarray.h>
#include <mpxcollectioncommanddefs.h>
#include <mpxcommandgeneraldefs.h>
#include <mpxmessagegeneraldefs.h>
#include <mpxcommandgeneraldefs.h>
#include <mpxcollectioncommanddefs.h>
#include <mpxviewpluginmanager.h>
#include <mpxviewplugin.h>
#include <mpxbacksteppingutility.h>
#include <mpxcollectionopenutility.h>

#include <mpxfindinmusicshop.h>
#include <mpxfindinmusicshopcommon.h>  // KFindInMShopKeyInValid
#include <MusicWapCenRepKeys.h>

// cenrep key need to be checked whether USB cable is connected in MTP/Combined Mode
#include <UsbWatcherInternalPSKeys.h>
#include <usbpersonalityids.h>
#include <mpxappui.hrh>
#include <mpxinternalcrkeys.h>
#include <mpxtlshelper.h>
#include <mpxuser.h>
#include "mpxcollectionviewhglistboxarray.h"
#include "mpxcommoncontainer.hrh"
#include "mpxcommonuihelper.h"
#include "mpxcollectionviewhgcontainer.h"
#include "mpxcollectionviewhg.hrh"
#include "mpxcollectionviewhg.hlp.hrh"
#include "mpxcollectionviewhgimp.h"
#include "mpxviewprivatepskeys.h"
#include "mpxlog.h"


// CONSTANTS
_LIT( KMPXCollectionRscPath, "mpxcollectionviewhg.rsc" );

const TInt KMilliSecondsToSeconds( 1000 );
const TInt KMPXReorderNaviPaneGranularity( 2 );
const TInt KMPXMaxBufferLength( 160 );
const TInt KMPXMaxTimeLength( 36 );
const TInt KMPXDurationDisplayResvLen( 10 );
const TInt KMPXPlaylistExportRetry( 10 );
const TInt KMPXDirectionUp( -1 );
const TInt KMPXDirectionDown( 1 );
const TInt KMPXErrDataNotReady( -8000 );
const TInt KMPXErrDataNotReadyCacheCommand( -8001 );
const TInt KMPXArrayGranularity( 100 );
const TInt KMusicCollectionMenuLevel( 2 );

_LIT( KMPXCollDetailsItemsFormat, "%S\t%S" );

_LIT( KCategoryEmpty, "" );

const TInt KIncrementalDelayNone = 0;
const TInt KIncrementalDelayHalfSecond = 1000000;
const TInt KIncrementalFetchBlockSize = 400;
const TInt KIncrementalDirectionCount = 8;
const TInt KProgressBarMaxValue = 100;  // Max Value for the Progress Info bar
const TInt KWaitNoteImpUid = 0x101FFC6C; // refresh wait note UID
#ifdef __ENABLE_PODCAST_IN_MUSIC_MENU
const TInt KMusicMenuPodcastMenuItemIndex = 4; // podcast menu item index
#define KPodcastCollectionUid 0x101FFC3C
#endif

const TInt KMaxIntLen( 10 );
_LIT8( KMVPrefix, "MVviewID:" );
const TInt KMVPrefixLen( 9 );

// Music setting
const TUid KCRUidMPXMPSettings = {0x101FFCDC};
const TUint32 KMPXMusicStoreUID = 0x00000003;
const TUint32 KOperatorMusicStore = 0x00000004;
const TUint32 KOperatorMusicStoreType = 0x00000005;
const TUint32 KOperatorMusicStoreDisplayName = 0x00000006;
const TUint32 KOperatorMusicStoreNativeUid = 0x00000007;
const TUint32 KOperatorMusicStoreJavaName = 0x00000008;
const TUint32 KOperatorMusicStoreWebPage = 0x00000009;
const TUint32 KOperatorMusicStoreURI = 0x0000000A;


const TInt KJavaMusicShopType( 1 );
const TInt KUIDMaxLength = 8;
const TInt KMPXMaxHistoryLength( 255 );

#define KProgressDownloadUid  0x10207BCD

// Music collection browse type
const TInt KMPXCollectionArtistAlbum( 3 );
const TInt KMPXCollectionGenre( 5 );


// ======== MEMBER FUNCTIONS ========

// ---------------------------------------------------------------------------
// Two-phased constructor.
// ---------------------------------------------------------------------------
//
CMPXCollectionViewHgImp* CMPXCollectionViewHgImp::NewL()
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::NewL" );
    CMPXCollectionViewHgImp* self = CMPXCollectionViewHgImp::NewLC();
    CleanupStack::Pop( self );
    return self;
    }

// ---------------------------------------------------------------------------
// Two-phased constructor.
// ---------------------------------------------------------------------------
//
CMPXCollectionViewHgImp* CMPXCollectionViewHgImp::NewLC()
    {
    CMPXCollectionViewHgImp* self = new ( ELeave ) CMPXCollectionViewHgImp();
    CleanupStack::PushL( self );
    self->ConstructL();
    return self;
    }

// ---------------------------------------------------------------------------
// Destructor
// ---------------------------------------------------------------------------
//
CMPXCollectionViewHgImp::~CMPXCollectionViewHgImp()
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::~CMPXCollectionViewHgImp" );

    if ( iCoverDisplay )
        {
        delete iCommandInitiator;
        }

    // Cleanup observer, does not panic if not found
    //
    AppUi()->RemoveViewDeactivationObserver( this );

    if ( iCollectionUtility )
        {
        iCollectionUtility->Close();
        }

    if ( iPlaybackUtility )
        {
        TRAP_IGNORE( iPlaybackUtility->RemoveObserverL( *this ) );
        iPlaybackUtility->Close();
        }

    if ( iViewUtility )
        {
        iViewUtility->RemoveObserver( this );
        iViewUtility->Close();
        }

    if ( iCollectionUiHelper )
        {
        iCollectionUiHelper->Close();
        }

    if ( iCollectionHelper )
        {
        iCollectionHelper->Close();
        }

    if ( iProfileEngine )
        {
        iProfileEngine->Release();
        }

    if ( iUpnpFrameworkSupport )
        {
        MPX_DEBUG1(_L("CMPXCollectionViewHgImp::~CMPXCollectionViewHgImp Detaching 'Copy to external' menu service..."));
        if ( iServiceHandler )
            {
            iServiceHandler->DetachMenu( R_MPX_COLLECTION_VIEW_MENU_1,
                                     R_MPX_UPNP_COPY_TO_EXTERNAL_MENU_INTEREST );
        iServiceHandler->DetachMenu( R_MPX_USE_AS_CASCADE,
                                 R_MPX_AIW_ASSIGN_INTEREST );
            delete iServiceHandler;
            iServiceHandler = NULL;
            }
        iPlayersList.Close();
        delete iSubPlayerName;
        }
    if ( iUpnpCopyCommand )
        {
        delete iUpnpCopyCommand;
        }

    if ( iServiceHandler )
        {
        iServiceHandler->DetachMenu( R_MPX_USE_AS_CASCADE,
                                 R_MPX_AIW_ASSIGN_INTEREST );
        delete iServiceHandler;
        }
    if ( iMediaRecognizer )
        {
        delete iMediaRecognizer;
        }

    if( iBackSteppingUtility )
        {
        iBackSteppingUtility->Close();
        }

    if ( iResourceOffset )
        {
        iEikonEnv->DeleteResourceFile( iResourceOffset );
        }

    if ( iContainer )
        {
        AppUi()->RemoveFromStack( iContainer );
        delete iContainer;
        }

    delete iNaviDecorator;
    delete iUserPlaylists;
    delete iCommonUiHelper;
    delete iSendUi;
    delete iTitle;
    delete iDuration;
    delete iOriginalTitle;
    delete iOriginalDuration;
    delete iNewName;
    delete iBottomIndex;
    delete iCurrentCba;
    delete iIncrementalOpenUtil;
    delete iCachedSelectionIndex;
    FeatureManager::UnInitializeLib();
    delete iOperatorMusicStoreName ;
    if ( iOperatorMusicStoreURI )
        {
        delete iOperatorMusicStoreURI;
        }
    }

// ---------------------------------------------------------------------------
// C++ default constructor can NOT contain any code, that
// might leave.
// ---------------------------------------------------------------------------
//
CMPXCollectionViewHgImp::CMPXCollectionViewHgImp() :
    iLastDepth( 1 ), iPlayIndex( KErrNotFound ),
    iSetMediaLCount( KErrNotFound ),
    iCurrentHighlightedIndex( KErrNotFound ),
    iCachedCommand( KErrNotFound ),
    iNoteType( EMPXNoteNotDefined ),
	iFirstIncrementalBatch( ETrue )
	{
    MPX_FUNC( "CMPXCollectionViewHgImp::CMPXCollectionViewHgImp" );
    iUsingNokiaService = EFalse;
#ifdef __ENABLE_MSK
    iCurrentMskId = KErrNotFound;
    iShowContextMenu = EFalse;
    iCollectionCacheReady = ETrue;
#endif // __ENABLE_MSK
#ifdef __ENABLE_PODCAST_IN_MUSIC_MENU
    iPodcast = EFalse;
#endif // __ENABLE_PODCAST_IN_MUSIC_MENU
    iInAlbumArtDialog = EFalse;

    iMarkedAll = EFalse;
    // grab the current process priority
    RProcess proc;
    iPriority = proc.Priority();
    }

void CMPXCollectionViewHgImp::HandleStatusPaneSizeChange()
    {
	MPX_FUNC( "CMPXCollectionViewHgImp::HandleStatusPaneSizeChange" );
	CMPXCollectionViewHg::HandleStatusPaneSizeChange();
	if ( iContainer )
        {
		iContainer->SetRect( ClientRect() );
        }
    }

// ---------------------------------------------------------------------------
// Symbian 2nd phase constructor can leave.
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::ConstructL()
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::ConstructL" );

// initialize FeatureManager
    FeatureManager::InitializeLibL();

    if ( FeatureManager::FeatureSupported( KFeatureIdCoverDisplay ) )
        {
        iCoverDisplay = ETrue;
        iCommandInitiator = CMediatorCommandInitiator::NewL( NULL );
        }
    else
        {
        iCoverDisplay = EFalse;
        }


    CCoeEnv* coeEnv( iEikonEnv );
    TParse parse;
    parse.Set( KMPXCollectionRscPath, &KDC_APP_RESOURCE_DIR, NULL );
    TFileName resourceFile( parse.FullName() );
    User::LeaveIfError( MPXUser::CompleteWithDllPath( resourceFile ) );
    BaflUtils::NearestLanguageFile( coeEnv->FsSession(), resourceFile );
    iResourceOffset = coeEnv->AddResourceFileL( resourceFile );

    BaseConstructL( R_MPX_COLLECTION_VIEW );

    iIsEmbedded = iEikonEnv->StartedAsServerApp();

    // create a new collection utility bound to the default context.
    iCollectionUtility = MMPXCollectionUtility::NewL( this, KMcModeDefault );
    iPlaybackUtility = MMPXPlaybackUtility::UtilityL( KPbModeDefault );
    iPlaybackUtility->AddObserverL( *this );
    iViewUtility = MMPXViewUtility::UtilityL();
    iViewUtility->AddObserverL( this );
    iBottomIndex = new (ELeave) CArrayFixFlat<TInt>( 1 );

    iCommonUiHelper = CMPXCommonUiHelper::NewL( iCollectionUtility );
    iCollectionUiHelper = CMPXCollectionHelperFactory::NewCollectionUiHelperL();

    // Monitor for view activation
    AppUi()->AddViewActivationObserverL( this );

    if (!iUpnpCopyCommand )
        {
        MPX_TRAPD ( error, iUpnpCopyCommand = CUpnpCopyCommand::NewL() );
		    if ( error == KErrNone )
            {
            iUpnpFrameworkSupport = ETrue;
            iServiceHandler = CAiwServiceHandler::NewL();
            MPX_DEBUG1("CMPXCollectionViewHgImp::ConstructL() Attaching 'Copy to external' menu service...");
            MPX_TRAP( iErrorAttachCopyMenu, iServiceHandler->AttachMenuL( R_MPX_COLLECTION_VIEW_MENU_1,
                                                   R_MPX_UPNP_COPY_TO_EXTERNAL_MENU_INTEREST ) );
            if ( iErrorAttachCopyMenu == KErrNotSupported )
                {
                // when CCoeEnv is not available
                User::Leave( iErrorAttachCopyMenu );
                }
            MPX_DEBUG2( "CMPXCollectionViewHgImp::ConstructL(): attach Copy menu error: %d", iErrorAttachCopyMenu );
            }
        else
            {
            iUpnpFrameworkSupport = EFalse;
            iUpnpCopyCommand = NULL;
            }
        }
    iMediaRecognizer = CMediaRecognizer::NewL();
    if ( iServiceHandler == NULL)
        {
        iServiceHandler = CAiwServiceHandler::NewL();
        }
    MPX_DEBUG1("CMPXCollectionViewHgImp::ConstructL() Attaching 'use tone as' menu service...");
    MPX_TRAP( iErrorAttachAssignMenu, iServiceHandler->AttachMenuL( R_MPX_USE_AS_CASCADE,
                                               R_MPX_AIW_ASSIGN_INTEREST ) );

    iNaviPane =
        static_cast<CAknNavigationControlContainer*>
        ( iAvkonViewAppUi->StatusPane()->ControlL(
            TUid::Uid( EEikStatusPaneUidNavi ) ) );
    iNaviDecorator = iNaviPane->CreateNavigationLabelL( KNullDesC );
    //Create label to change text in Navi pane
    iNaviLabel = static_cast<CAknNaviLabel*>
            ( iNaviDecorator->DecoratedControl() );

    TInt flags( 0 );
    CRepository* repository = CRepository::NewL( KCRUidMPXMPFeatures );
    repository->Get( KMPXMPLocalVariation, flags );
    delete repository;
    iGoToMusicShopOptionHidden =
        !static_cast<TBool>( flags & KMPXEnableGoToMusicShopOption );
    iUsingNokiaService =
        static_cast<TBool>( flags & KMPXEnableFindInMusicShopOption );
    MPX_DEBUG2( "CMPXCollectionViewHgImp::ConstructL(): iUsingNokiaService: %d", iUsingNokiaService );
    iDisablePodcasting = flags&KMPXDisablePodcastingOption ? ETrue : EFalse;

#ifdef _DEBUG
    iExitOptionHidden = EFalse;
#else // _DEBUG
    iExitOptionHidden = iCommonUiHelper->ExitOptionHiddenL() && !iIsEmbedded;
#endif // _DEBUG

    iBottomIndex->AppendL( 0 );
    iProfileEngine = CreateProfileEngineL();

    _LIT_SECURITY_POLICY_C1(KMPlayerRemoteReadPolicy, ECapabilityReadUserData);
    _LIT_SECURITY_POLICY_C1(KMPlayerRemoteWritePolicy, ECapabilityWriteUserData);

    if (iGoToMusicShopOptionHidden)
        {
        iMusicStoreUID = 0;
        }
    else
        {
        // Get music store uid from cenrep
        //
        TBuf8< KUIDMaxLength > musicStoreUID;
        TRAP_IGNORE(
            {
            CRepository* repository = CRepository::NewL( KCRUidMPXMPSettings );
            repository->Get( KMPXMusicStoreUID, musicStoreUID );
            delete repository;
            repository = NULL;
            } );

        GetUint32Presentation( iMusicStoreUID, musicStoreUID, 0 );
        if (iMusicStoreUID == 0)
            {
            iGoToMusicShopOptionHidden = ETrue;
            }
        }
    MPX_DEBUG2("CMPXCollectionViewHgImp::ConstructL musicStoreUID = %x", iMusicStoreUID);

    TInt retval(KErrNone);
    // P/S key for music shop
    retval = RProperty::Define( TUid::Uid(iMusicStoreUID),
                                KMShopCategoryId,
                                RProperty::EInt,
                                KMPlayerRemoteReadPolicy,
                                KMPlayerRemoteWritePolicy );

    if( retval != KErrAlreadyExists)
        {
        RProperty::Set( TUid::Uid(iMusicStoreUID),
                        KMShopCategoryId,
                        KFindInMShopKeyInValid );  // initialize Find In Musicshop was not called


        RProperty::Define(  TUid::Uid(iMusicStoreUID),
                            KMShopCategoryName,
                            RProperty::ELargeText,
                            KMPlayerRemoteReadPolicy,
                            KMPlayerRemoteWritePolicy );
        }

    iCachedSelectionIndex = new ( ELeave )CArrayFixFlat<TInt>( KMPXArrayGranularity );
    iIncrementalOpenUtil = CMPXCollectionOpenUtility::NewL( this );

    // Initialize the Back Stepping Service Utility with the MPX Music Player
    iBackSteppingUtility = MMPXBackSteppingUtility::UtilityL();
    iBackSteppingUtility->InitializeL(
        TUid::Uid( KMusicPlayerAppUidConstant ) );
    iActivateBackStepping = EFalse;

    iIsAddingToPlaylist = EFalse;

       // Get music store information from cenrep
   //
   TBuf8< KUIDMaxLength > operatorMusicStoreUID;

   iOperatorMusicStoreName = HBufC16::NewL( KMPXMaxHistoryLength );
   TPtr operatorMusicStoreMenuOption = iOperatorMusicStoreName->Des();

   HBufC16* musicStoreJavaName = HBufC16::NewLC( KMPXMaxHistoryLength );
   TPtr operatorMusicStoreJavaName = musicStoreJavaName->Des();

   TRAP_IGNORE(
    {
    CRepository* musicshoprepository = CRepository::NewL( KCRUidMPXMPSettings );
    musicshoprepository->Get( KOperatorMusicStore, iOperatorMusicStore );
    if(iOperatorMusicStore)
        {
        musicshoprepository->Get( KOperatorMusicStoreType, iOperatorMusicStoreType );
        musicshoprepository->Get( KOperatorMusicStoreDisplayName, operatorMusicStoreMenuOption );
        if (iOperatorMusicStoreType == KJavaMusicShopType)
            {
            musicshoprepository->Get( KOperatorMusicStoreJavaName, operatorMusicStoreJavaName );
            }
        else
            {
            musicshoprepository->Get( KOperatorMusicStoreNativeUid, operatorMusicStoreUID );
            GetUint32Presentation( iOperatorNativeMusicStoreUID, operatorMusicStoreUID, 0 );

            musicshoprepository->Get(KOperatorMusicStoreWebPage, iMusicStoreWebPage);
            iOperatorMusicStoreURI = HBufC16::NewL( KMPXMaxHistoryLength );
            TPtr16 operatorMusicStoreuri = iOperatorMusicStoreURI->Des();
            musicshoprepository->Get(KOperatorMusicStoreURI, operatorMusicStoreuri);

            }
        }
    delete musicshoprepository;
    musicshoprepository = NULL;
    } );

    if(iOperatorMusicStoreType == KJavaMusicShopType)
        {
            TApaAppInfo appInfo;
            RApaLsSession apaSession;
            User::LeaveIfError( apaSession.Connect() );
            CleanupClosePushL( apaSession );
            User::LeaveIfError( apaSession.GetAllApps() );

            while ( apaSession.GetNextApp( appInfo ) == KErrNone )
                {
                if(appInfo.iFullName.Right(8).Compare(_L(".fakeapp")) == 0)
                    {
                    TApaAppCaption appname;
                    appname = appInfo.iCaption ;
                    if (!appInfo.iCaption.Compare(operatorMusicStoreJavaName))
                        {
                        iOperatorMusicStoreUID = appInfo.iUid;
                        }
                    }
                }
            CleanupStack::PopAndDestroy(&apaSession); // close apaSession
        }
    //else
    //    {
    //    GetUint32Presentation( iMusicStoreUID, operatorMusicStoreUID, 0 );
    //    }
    CleanupStack::PopAndDestroy(musicStoreJavaName);

    TInt retval2(KErrNone);
    // P/S key for usb unblocking
    retval2 = RProperty::Define( KMPXViewPSUid,
                                KMPXUSBUnblockingPSStatus,
                                RProperty::EInt,
                                KMPlayerRemoteReadPolicy,
                                KMPlayerRemoteWritePolicy );

    TInt usbStatus;
    RProperty::Get(KPSUidUsbWatcher, KUsbWatcherSelectedPersonality, usbStatus);


    // if object doesn't exist or the usb doesn't connect
    if(( retval2 != KErrAlreadyExists )
            || ( usbStatus != KUsbPersonalityIdPCSuite
                    || usbStatus != KUsbPersonalityIdMS
                    || usbStatus != KUsbPersonalityIdPTP
                    || usbStatus != KUsbPersonalityIdMTP
                    || usbStatus != KUsbPersonalityIdPCSuiteMTP ))
        {
        RProperty::Set( KMPXViewPSUid,
                        KMPXUSBUnblockingPSStatus,
                        EMPXUSBUnblockingPSStatusUninitialized );
        }
    // if usb mode is in MTP mode or pc suite mode
    else if ( usbStatus == KUsbPersonalityIdMTP
    		|| usbStatus == KUsbPersonalityIdPCSuiteMTP
    		|| usbStatus == KUsbPersonalityIdPCSuite )
    	{
    	RProperty::Set( KMPXViewPSUid,
    			KMPXUSBUnblockingPSStatus,
    			EMPXUSBUnblockingPSStatusActive );
    	}
    }

// ---------------------------------------------------------------------------
// Delete the selected items in TBone View
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::DeleteSelectedTBoneItemsL(TInt aCommand)
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::DeleteSelectedTBoneItemsL" );
     // if reorder mode is on, or something is currently deleting, disable delete
    TBool isIgnore( iContainer->IsInReorderMode() || iIsDeleting );

    if ( !isIgnore  && iCollectionReady )
        {
        CMPXCommonListBoxArrayBase* listboxArray( iContainer->ListBoxArray() );
        const CMPXMedia& containerMedia( listboxArray->ContainerMedia() );

        TMPXGeneralType containerType(
            containerMedia.ValueTObjectL<TMPXGeneralType>(
                KMPXMediaGeneralType ) );
        TMPXGeneralCategory containerCategory(
            containerMedia.ValueTObjectL<TMPXGeneralCategory>(
                KMPXMediaGeneralCategory ) );

        const TMPXItemId containerId = containerMedia.ValueTObjectL<TMPXItemId>(KMPXMediaGeneralId);

        HBufC* promptTxt( NULL );
        HBufC* waitNoteText( NULL );
        TInt waitNoteCBA( R_AVKON_SOFTKEYS_EMPTY );
        
        // Create a copy of collection path
        CMPXCollectionPath* path( iCollectionUtility->Collection().PathL() );
        CleanupStack::PushL( path );

        if ( containerType == EMPXItem && containerCategory == EMPXAlbum )    
            {             
             //get the media object of the selected track in TBone View
            CMPXMedia* albumTrack = iContainer->SelectedItemMediaL();
            
            TMPXGeneralType mediaType(
                    albumTrack->ValueTObjectL<TMPXGeneralType>(
                            KMPXMediaGeneralType ) );
            TMPXGeneralCategory mediaCategory(
                    albumTrack->ValueTObjectL<TMPXGeneralCategory>(
                    KMPXMediaGeneralCategory ) );

            if ( mediaType == EMPXItem && mediaCategory == EMPXSong )
                {
                // tracks level in Tbone View
                TMPXItemId trackId = albumTrack->ValueTObjectL<TMPXItemId>(KMPXMediaGeneralId);
                const TDesC& trackTitle( albumTrack->ValueText( KMPXMediaGeneralTitle ) );
                // create the item path to delete
                 path->Back();
                 path->Back();
                 path->AppendL(containerId);
                 path->AppendL(trackId);

                waitNoteText = StringLoader::LoadLC(
                    R_MPX_QTN_ALBUM_WAITING_DELETING, trackTitle );
                promptTxt = StringLoader::LoadLC(
                    R_MPX_QTN_QUERY_COMMON_CONF_DELETE,
                    trackTitle );

                iConfirmationDlg = CAknQueryDialog::NewL(
                CAknQueryDialog::EConfirmationTone );

                waitNoteCBA = R_MPX_COLLECTION_WAITNOTE_SOFTKEYS_EMPTY_STOP;
                
                iConfirmationDlg->SetPromptL( *promptTxt );
                CleanupStack::PopAndDestroy( promptTxt );
                TBool performDelete(EFalse);
                if(iCachedCommand == aCommand)
                   {
                   performDelete = ETrue;
                   }
                if (!performDelete)
                    {
                    if ( iConfirmationDlg->ExecuteLD( R_MPX_CUI_DELETE_CONFIRMATION_QUERY ) )
                        {
                        performDelete = ETrue;
                        }
                    }
                if (performDelete)
                    {
                    HandleCommandL( EMPXCmdIgnoreExternalCommand );
                    MPX_PERF_START_EX( MPX_PERF_SHOW_WAITNOTE );
                    if(iCachedCommand != aCommand)
                        {
                        iIsWaitNoteCanceled = EFalse;
                        StartProgressNoteL();
                        TPtr buf = waitNoteText->Des();
                        UpdateProcessL(0, buf);
                        }
                    if ( !iIsWaitNoteCanceled )
                        {
                        iIsDeleting = ETrue;
                        iCollectionUiHelper->DeleteL( *path, this );
                        }
                    else if( iContainer )
                        {
                        // delete was canceled before it even began, clear marked items
                        iContainer->ClearLbxSelection();
                        }
                    iIsWaitNoteCanceled = EFalse;
        
                    if(iContainer->FindBoxVisibility())
                        {
                        iContainer->EnableFindBox(EFalse);
                        }
                    }
                iConfirmationDlg = NULL;
                CleanupStack::PopAndDestroy( waitNoteText );
                }
            }
        CleanupStack::PopAndDestroy( path );
        }
    }


// ---------------------------------------------------------------------------
// Delete the selected items
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::DeleteSelectedItemsL(TInt aCommand)
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::DeleteSelectedItemsL" );

    // if reorder mode is on, or something is currently deleting, disable delete
    TBool isIgnore( iContainer->IsInReorderMode() || iIsDeleting );

    CMPXCommonListBoxArrayBase* listboxArray(
        iContainer->ListBoxArray() );
    const CMPXMedia& containerMedia( listboxArray->ContainerMedia() );
    TInt currentIndex( iContainer->CurrentLbxItemIndex() );

    // Marked indicies
    // cannot use the caches indexes since this can be reached by pressing the cancel key
    const CArrayFix<TInt>* array (
        iContainer->CurrentSelectionIndicesL() ); // not owned
    TInt arrayCount( array->Count() );

    if ( !isIgnore )
        {
        if ( iContainer->CurrentListItemCount() == 0 )
            {
            // list is empty
            isIgnore = ETrue;
            }
        if ( !isIgnore &&
            containerMedia.IsSupported( KMPXMediaGeneralNonPermissibleActions ) )
            {
            TMPXGeneralNonPermissibleActions attr(
                containerMedia.ValueTObjectL<TMPXGeneralNonPermissibleActions>(
                KMPXMediaGeneralNonPermissibleActions ) );
            if ( attr & EMPXWrite )
                {
                isIgnore = ETrue;
                }
            }
        if ( !isIgnore )
            {
            const CMPXMedia& media( listboxArray->MediaL( currentIndex ) );
            if ( ( arrayCount == 0 || arrayCount == 1 ) &&
                ( media.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) == KMPXInvalidItemId ) )
                {
                // not marked, or only 1 item is marked
                // and the highlighted item is not yet available
                isIgnore = ETrue;
                }
            else if ( media.IsSupported( KMPXMediaGeneralNonPermissibleActions ) )
                {
                TMPXGeneralNonPermissibleActions attr(
                    media.ValueTObjectL<TMPXGeneralNonPermissibleActions>(
                        KMPXMediaGeneralNonPermissibleActions ) );
                if ( attr & EMPXWrite )
                    {
                    isIgnore = ETrue;
                    }
                }
            }
        }

    if ( !isIgnore )
        {
        // Create a copy of collection path
        CMPXCollectionPath* path( iCollectionUtility->Collection().PathL() );
        CleanupStack::PushL( path );
        HBufC* promptTxt( NULL );
        HBufC* waitNoteText( NULL );
        TInt waitNoteCBA( R_AVKON_SOFTKEYS_EMPTY );
        MPX_DEBUG2( "CMPXCollectionViewHgImp::DeleteSelectedItemsL delete array count = %d", arrayCount );

        TMPXGeneralType containerType(
            containerMedia.ValueTObjectL<TMPXGeneralType>(
                KMPXMediaGeneralType ) );
        TMPXGeneralCategory containerCategory(
            containerMedia.ValueTObjectL<TMPXGeneralCategory>(
                KMPXMediaGeneralCategory ) );

        if ( arrayCount > 1 )
            {
            if ( containerType == EMPXItem && containerCategory == EMPXPlaylist )
                {
                // playlist view
                waitNoteText = StringLoader::LoadLC(
                    R_MPX_QTN_NMP_NOTE_REMOVING_MANY );
                promptTxt = StringLoader::LoadLC(
                    R_MPX_QTN_MUS_QUERY_CONF_REMOVE_MANY,
                    arrayCount );
                }
            else
                {
                waitNoteText = StringLoader::LoadLC(
                    R_MPX_QTN_NMP_DEL_SONGS_WAIT_NOTE );
                promptTxt = StringLoader::LoadLC(
                    R_MPX_QTN_NMP_DEL_SONGS_QUERY,
                    arrayCount );
                }
            waitNoteCBA = R_MPX_COLLECTION_WAITNOTE_SOFTKEYS_EMPTY_STOP;
            iConfirmationDlg = CAknQueryDialog::NewL(
                CAknQueryDialog::EConfirmationTone );
            if ( iCoverDisplay )
                {
                if ( containerType == EMPXItem && containerCategory == EMPXPlaylist )
                    {
                    iConfirmationDlg->PublishDialogL(
                        EMPlayerQueryRemoveTracks,
                        KMPlayerNoteCategory);
                    iWaitNoteId = EMPlayerNoteRemovingMany;
                    }
                else
                    {
                    iConfirmationDlg->PublishDialogL(
                        EMPlayerQueryDeleteTracks,
                        KMPlayerNoteCategory);
                    iWaitNoteId = EMPlayerNoteDeletingMany;
                    }
                CAknMediatorFacade* covercl(
                    AknMediatorFacade( iConfirmationDlg ) );
                if ( covercl )
                    {
                    covercl->BufStream().WriteInt32L( arrayCount );
                    }
                }
            if(iCollectionReady || aCommand == EMPXCmdCommonDelete )
                {
            for ( TInt i = 0; i < arrayCount; i++ )
                {
                MPX_DEBUG2( "CMPXCollectionViewHgImp::DeleteSelectedItemsL delete array index = %d", array->At( i ) );
                path->SelectL( array->At(i) );
                    }
                }
            }
        else
            {
            // not marked, process the highlighted item
            const CMPXMedia& media( listboxArray->MediaL(
                ( arrayCount > 0 ) ? array->At( 0 ) : currentIndex ) );
            const TDesC& title( media.ValueText( KMPXMediaGeneralTitle ) );

            TMPXGeneralType type(
                media.ValueTObjectL<TMPXGeneralType>( KMPXMediaGeneralType ) );
            TMPXGeneralCategory category(
                media.ValueTObjectL<TMPXGeneralCategory>(
                    KMPXMediaGeneralCategory ) );

            if ( containerType == EMPXItem && containerCategory == EMPXPlaylist )
                {
                // playlist view
                waitNoteText = StringLoader::LoadLC(
                    R_MPX_QTN_MUS_NOTE_REMOVING_TRACK, title );
                promptTxt = StringLoader::LoadLC(
                    R_MPX_QTN_MUS_QUERY_CONF_REMOVE_TRACK,
                    title );
                }
            else if ( containerType == EMPXItem && containerCategory == EMPXArtist
                && type == EMPXItem && category == EMPXAlbum && currentIndex == 0 )
                {
                // deleting first entry in artist/album view
                const TDesC& containerTitle(
                    containerMedia.ValueText( KMPXMediaGeneralTitle ) );
                waitNoteText = StringLoader::LoadLC(
                    R_MPX_QTN_MUS_QUERY_CONF_DELETE_ALL, containerTitle );
                waitNoteCBA = R_MPX_COLLECTION_WAITNOTE_SOFTKEYS_EMPTY_STOP;
                promptTxt = StringLoader::LoadLC(
                    R_MPX_QTN_NMP_QUERY_CONF_DELETE_GROUP,
                    containerTitle );
                }
            else
                {
                if ( ( type == EMPXItem && category == EMPXSong ) ||
                    ( type == EMPXItem && category == EMPXPlaylist ) )
                    {
                    // tracks level, or deleting a playlist
                    waitNoteText = StringLoader::LoadLC(
                        R_MPX_QTN_ALBUM_WAITING_DELETING, title );
                    promptTxt = StringLoader::LoadLC(
                        R_MPX_QTN_QUERY_COMMON_CONF_DELETE,
                        title );
                    }
                else
                    {
                    // deleting a group
                    if ( ( currentIndex == ( iContainer->CurrentListItemCount() - 1 ) ) &&
                        title.Compare( KNullDesC ) == 0 )
                        {
                        // check for unknown entry
                        // if it's the last entry, and it's null text
                        // load "unknown" text to display in prompt
                        HBufC* unknownText( StringLoader::LoadLC( R_MPX_QTN_MP_UNKNOWN ) );
                        waitNoteText = StringLoader::LoadLC(
                            R_MPX_QTN_MUS_QUERY_CONF_DELETE_ALL, *unknownText );
                        promptTxt = StringLoader::LoadL(
                            R_MPX_QTN_NMP_QUERY_CONF_DELETE_GROUP, *unknownText );
                        CleanupStack::Pop( waitNoteText );
                        CleanupStack::PopAndDestroy( unknownText );
                        CleanupStack::PushL( waitNoteText );
                        CleanupStack::PushL( promptTxt );
                        }
                    else
                        {
                        waitNoteText = StringLoader::LoadLC(
                            R_MPX_QTN_MUS_QUERY_CONF_DELETE_ALL, title );
                        promptTxt = StringLoader::LoadLC(
                            R_MPX_QTN_NMP_QUERY_CONF_DELETE_GROUP, title );
                        }
                    waitNoteCBA = R_MPX_COLLECTION_WAITNOTE_SOFTKEYS_EMPTY_STOP;
                    }
                }
            iConfirmationDlg = CAknQueryDialog::NewL(
                CAknQueryDialog::EConfirmationTone );
            if ( iCoverDisplay )
                {
                if ( containerType == EMPXItem && containerCategory == EMPXPlaylist )
                    {
                    iConfirmationDlg->PublishDialogL(
                        EMPlayerQueryRemoveTrack,
                        KMPlayerNoteCategory);
                    iWaitNoteId = EMPlayerNoteRemovingTrack;
                    }
                else if ( containerType == EMPXItem && containerCategory == EMPXArtist
                    && type == EMPXItem && category == EMPXAlbum && currentIndex == 0 )
                    {
                    iConfirmationDlg->PublishDialogL(
                        EMPlayerQueryDeleteCategory,
                        KMPlayerNoteCategory);
                    iWaitNoteId = EMPlayerNoteDeletingSingle;
                    }
                else
                    {
                    if ( ( type == EMPXItem && category == EMPXSong ) ||
                        ( type == EMPXItem && category == EMPXPlaylist ) )
                        {
                        // tracks level
                        iConfirmationDlg->PublishDialogL(
                            EMPlayerQueryDeleteCategory,
                            KMPlayerNoteCategory);
                        iWaitNoteId = EMPlayerNoteDeletingSingle;
                        }
                    else
                        {
                        iConfirmationDlg->PublishDialogL(
                            EMPlayerQueryDeleteTrack,
                            KMPlayerNoteCategory);
                        iWaitNoteId = EMPlayerNoteDeletingSingle;
                        }
                    }
                CAknMediatorFacade* covercl(
                    AknMediatorFacade( iConfirmationDlg ) );
                if ( covercl )
                    {
                    covercl->BufStream() << title;
                    }
                iItemTitle.Set( title );
                }
//#endif //__COVER_DISPLAY
// Cover UI end
            if(iCollectionReady || aCommand == EMPXCmdCommonDelete )
                {
            path->SelectL( arrayCount > 0 ? array->At( 0 ) : currentIndex );
                }
            }
        iConfirmationDlg->SetPromptL( *promptTxt );
        CleanupStack::PopAndDestroy( promptTxt );
        TBool performDelete(EFalse);
        if(iCachedCommand == aCommand)
            {
            performDelete = ETrue;
            }
        if (!performDelete)
            {
        if ( iConfirmationDlg->ExecuteLD( R_MPX_CUI_DELETE_CONFIRMATION_QUERY ) )
                {
                performDelete = ETrue;
                }
            }
        if (performDelete)
            {
            HandleCommandL( EMPXCmdIgnoreExternalCommand );
// Cover UI start
//#ifdef __COVER_DISPLAY
        if ( iCoverDisplay )
            {
            InitiateWaitDialogL();
            }
//#endif // __COVER_DISPLAY
// Cover UI end
            MPX_PERF_START_EX( MPX_PERF_SHOW_WAITNOTE );
            if(iCachedCommand != aCommand)
                {
                iIsWaitNoteCanceled = EFalse;
                StartProgressNoteL();
				TPtr buf = waitNoteText->Des();
				UpdateProcessL(0, buf);
                }

                if ( !iIsWaitNoteCanceled )
                    {
                    iIsDeleting = ETrue;
                    iCollectionUiHelper->DeleteL( *path, this );
                    }
                else if( iContainer )
                    {
                    // delete was canceled before it even began, clear marked items
                    iContainer->ClearLbxSelection();
                    }
                iIsWaitNoteCanceled = EFalse;


            if(iContainer->FindBoxVisibility())
                {
                iContainer->EnableFindBox(EFalse);
                }
            }
        iConfirmationDlg = NULL;
        CleanupStack::PopAndDestroy( waitNoteText );
        CleanupStack::PopAndDestroy( path );
        }
    }

// ---------------------------------------------------------------------------
// Initiates wait dialog
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::InitiateWaitDialogL()
    {
    if ( iCommandInitiator )
        {
        HBufC8* filename8 = HBufC8::NewLC( KMaxFileName );
        filename8->Des().Copy( iItemTitle );
        HBufC8* data = HBufC8::NewLC(KMaxFileName);

        TPtr8 dataPtr = data->Des();
        RDesWriteStream str(dataPtr);

        TPtrC8 b(KNullDesC8);
        b.Set(*filename8);

        str << b;
        str.CommitL();

        iCommandInitiator->IssueCommand( KMediatorSecondaryDisplayDomain,
                                    KMPlayerNoteCategory,
                                    iWaitNoteId,
                                    TVersion ( 0,0,0 ),
                                    *data );

        CleanupStack::PopAndDestroy( data );
        CleanupStack::PopAndDestroy( filename8 );
        }
    }

// ---------------------------------------------------------------------------
// Updates list box
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::UpdateListBoxL(
    const CMPXMedia& aEntries,
    TInt aIndex,
    TBool aComplete)
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::UpdateListBox" );
    MPX_DEBUG2( "CMPXCollectionViewHgImp::UpdateListBox aIndex = %d", aIndex );
    if ( iContainer )
        {
        CMPXCollectionPath* cpath( iCollectionUtility->Collection().PathL() );
        MPX_DEBUG_PATH(*cpath);

        CleanupStack::PushL( cpath );

        TInt topIndex = 0;
        if (iContainer->IsInReorderMode())
            {
            TInt currentItem( iContainer->CurrentLbxItemIndex() );
            TInt currentBottomIndex( iContainer->BottomLbxItemIndex() );
            topIndex = iContainer->CalculateTopIndex( currentBottomIndex ) ;
            }

        CMPXCommonListBoxArrayBase* array( iContainer->ListBoxArray() );
        array->ResetMediaArrayL();
        array->AppendMediaL( aEntries );
        iCollectionCacheReady = ETrue;
        //keep the marked item indicies
        const CArrayFix<TInt>* markedList = iContainer->CurrentSelectionIndicesL();
		if ( iFirstIncrementalBatch )
            {
            iContainer->HandleLbxItemAdditionL();
            iFirstIncrementalBatch = EFalse;
            }
		else
			{
			iContainer->HandleListBoxArrayEventL(
			MMPXCommonListBoxArrayObserver::EMPXCommonListBoxArrayEventMediaArrayChange );
			}

        if (aComplete)
            {
            iFirstIncrementalBatch = ETrue;
            }
        //mark all again after list box item addition
        if (iMarkedAll)
            {
            iContainer->HandleMarkableListProcessCommandL(EAknMarkAll);
            if (aComplete)
                {
                iMarkedAll = EFalse;
                }
            }
		   //mark again individual items after list box item addition
        else if ( markedList )
            {
		       TInt markedItemCount( markedList->Count() );
		       if ( markedItemCount >0 )
                {
                iContainer->SetCurrentSelectionIndicesL( const_cast<CArrayFix<TInt>*>(markedList) );
                }
            }
        UpdatePlaybackStatusL();

        if ( iBackOneLevel || iPossibleJump )
            {
            if ( cpath->Levels() == iLastDepth )
                {
                iLastDepth--;
                iContainer->SetLbxTopItemIndex(
                    iContainer->CalculateTopIndex(
                    iBottomIndex->At( iLastDepth ) ) );
                iContainer->SetLbxCurrentItemIndexAndDraw( aIndex );
                iBottomIndex->Delete( iLastDepth );
                }
            else
                {
                MPX_DEBUG1( "CMPXCollectionViewHgImp::UpdateListBox Invalid history, rebuilding" );
                // invalid path, rebuild with all 0. possibily caused by a jump in views
                iBottomIndex->Reset();
                iLastDepth = cpath->Levels();
                for ( TInt i = 0; i < iLastDepth; i++ )
                    {
                    iBottomIndex->AppendL( 0 );
                    }
                iContainer->SetLbxCurrentItemIndexAndDraw( aIndex );
                }
            iPossibleJump = EFalse;
            iBackOneLevel = EFalse;
            }
        else
            {
            if ( iAddingSong )
                {
                // always highlight the last item when a track
                // is added in add tracks view
                TInt currentItemCount =
                    iContainer->CurrentListItemCount();
                if ( currentItemCount > 0 )
                    {
                    iContainer->
                        SetLbxCurrentItemIndexAndDraw( currentItemCount - 1 );
                    }
                }
            else if ( iCurrentHighlightedIndex > KErrNotFound &&
                ( iCurrentHighlightedIndex <
                iContainer->CurrentListItemCount() ) )
                {
                if (iContainer->IsInReorderMode())
                    {
                    iContainer->SetLbxTopItemIndex( topIndex );
                    }
                iContainer->
                    SetLbxCurrentItemIndexAndDraw( iCurrentHighlightedIndex );
                iCollectionUtility->Collection().CommandL(
                    EMcCmdSelect, iCurrentHighlightedIndex );
                iCurrentHighlightedIndex = KErrNotFound;
                }
            else if ( ( aIndex > 0 )
                && ( aIndex < iContainer->CurrentListItemCount() ) )
                {
                iContainer->SetLbxCurrentItemIndexAndDraw( aIndex );
                }
            else
                {
                iContainer->SetLbxCurrentItemIndexAndDraw( 0 );
                }
            }
        if (!aComplete || cpath->Levels() == KMusicCollectionMenuLevel || iContainer->IsInReorderMode())
            {
            iContainer->EnableFindBox(EFalse);
            }
        else
            {
            iContainer->EnableFindBox(ETrue);
            }

        CleanupStack::PopAndDestroy( cpath );
        }
    }

// ---------------------------------------------------------------------------
// Displays error notes.
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::HandleError( TInt aError )
    {
    MPX_DEBUG2( "CMPXCollectionViewHgImp::HandleError(%d)", aError );
    ASSERT( aError );

    // only display error message if collection view is in the foreground
    if ( iContainer )
        {
        TRAP_IGNORE( iCommonUiHelper->HandleErrorL( aError ) );
        }
    }

// ---------------------------------------------------------------------------
// Updates the navi pane
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::UpdateNaviPaneL()
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::UpdateNaviPaneL" );
    if ( iContainer &&
        (iViewUtility->ActiveViewType() !=
                       TUid::Uid( KMPXPluginTypeAddSongsEditorUid )) &&
        (iViewUtility->ActiveViewType() !=
                      TUid::Uid( KMPXPluginTypeAlbumArtEditorUid )) &&
        (iViewUtility->ActiveViewType() !=
                      TUid::Uid( KMPXPluginTypeMetadataEditorUid ))
       )
        {
        MPX_DEBUG2("CMPXCollectionViewHgImp::UpdateNaviPaneL updating %d", iDuration);
        if ( iDuration )
            {
            iNaviLabel->SetTextL( *iDuration );
            iNaviPane->PushL( *iNaviDecorator );
            }
        else
            {
            iNaviPane->Pop( iNaviDecorator );
            }
        iNaviPane->DrawNow();
        }
    }

// ---------------------------------------------------------------------------
// Updates the title pane
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::UpdateTitlePaneL()
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::UpdateTitlePaneL" );
    // Set title

    if ( iViewUtility->ActiveViewType() ==
        TUid::Uid( KMPXPluginTypeCollectionUid ) ||
        ( iViewUtility->ActiveViewType() ==
         TUid::Uid( KMPXPluginTypeWaitNoteDialogUid ) && iContainer ) )
        {
        CAknTitlePane* title( NULL );

        TRAP_IGNORE(
            {
            title = static_cast<CAknTitlePane*>
                ( StatusPane()->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) );
            } );

        if ( title )
            {
            if ( iTitle )
                {
                title->SetTextL( *iTitle );
                }
            else if ( !iIsEmbedded )
                {
                // use default title if no metadata is available
                // and is not in embedded view
                HBufC* titleText = StringLoader::LoadLC(
                    R_MPX_COLLECTION_VIEW_TITLE );
                title->SetTextL( *titleText );
                CleanupStack::PopAndDestroy( titleText );
                }
            }
        }
    }

// ---------------------------------------------------------------------------
// Updates playback status indicator
// ---------------------------------------------------------------------------
//
TInt CMPXCollectionViewHgImp::UpdatePlaybackStatusL()
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::UpdatePlaybackStatusL" );
    TInt ret( KErrNotFound );  // default selection
    if ( iContainer )
        {
        TMPXPlaybackState pbState( EPbStateNotInitialised );
        TInt selectedIndex( KErrNotFound );
        TMPXItemId selectedItemId( KMPXInvalidItemId );
        CMPXCollectionPath* cpath( iCollectionUtility->Collection().PathL() );
        CleanupStack::PushL( cpath );

        MMPXSource* source( iPlaybackUtility->Source() );
        if ( source )
            {
            CMPXCollectionPlaylist* playlist( source->PlaylistL() );
            if ( playlist )
                {
                CleanupStack::PushL( playlist );
                CMPXCollectionPath* pbPath(
                    CMPXCollectionPath::NewL( playlist->Path() ) );
                CleanupStack::PushL( pbPath );
                TInt playbackPathCount( pbPath->Levels() );
                if ( cpath->Levels() == playbackPathCount )
                    {
                    // not comparing the index
                    TBool isEqual( ETrue );
                    for ( TInt i = 0; i < playbackPathCount - 1; i++ )
                        {
                        if ( cpath->Id( i ) != pbPath->Id( i ) )
                            {
                            isEqual = EFalse;
                            break;
                            }
                        }
                    if ( isEqual )
                        {
                        selectedIndex = pbPath->Index();
                        selectedItemId = pbPath->Id();
                        ret = selectedIndex;
                        pbState = iPlaybackUtility->StateL();
                        }
                    }
                CleanupStack::PopAndDestroy( pbPath );
                CleanupStack::PopAndDestroy( playlist );
                }
            }
        CleanupStack::PopAndDestroy( cpath );
        if ( selectedIndex != KErrNotFound )
            {
            if ( iContainer->IsInReorderMode() )
                {
                // in reorder mode, need to pass unique ID to list box
                // to search for now playing song
                iContainer->SetPlaybackStatusByIdL( selectedItemId, pbState );
                }
            else
                {
                // Fixed for EBLI-7AG8ZN, the Playlist in the Engine is updated
                // later than UI (because of Inc Open), so index does not work
                iContainer->SetPlaybackStatusByIdL( selectedItemId, pbState, selectedIndex );
                }
            }
        }
    return ret;
    }

// ---------------------------------------------------------------------------
// Start a refreshing note
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::StartWaitNoteL( TWaitNoteType aNoteType )
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::StartWaitNoteL" );
    TUid waitnoteId = TUid::Uid( KMPXPluginTypeWaitNoteDialogUid );
    TUid activeView = iViewUtility->ActiveViewType();
    if( !iIsEmbedded && activeView != waitnoteId )
        {
        TPckg<TWaitNoteType> note = aNoteType;
        HBufC* arg = MPXUser::AllocL( note );
        CleanupStack::PushL( arg );
        RProcess proc;
        iPriority = proc.Priority();
        proc.SetPriority( EPriorityHigh );
        iNoteType = aNoteType;
        iViewUtility->ActivateViewL( waitnoteId, arg );
        CleanupStack::PopAndDestroy( arg );
        }
    }

// ---------------------------------------------------------------------------
// Start a Progress note
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::StartProgressNoteL()
    {
    iProgressDialog = new (ELeave) CAknProgressDialog(
        (REINTERPRET_CAST(CEikDialog**, &iProgressDialog)),
        ETrue);
    iProgressDialog->PrepareLC(R_MPX_PROGRESS_NOTE);
    iProgressInfo = iProgressDialog->GetProgressInfoL();
    iProgressDialog->SetCallback(this);
    iProgressDialog->RunLD();
    iProgressInfo->SetFinalValue(KProgressBarMaxValue);
    }

// ---------------------------------------------------------------------------
// Update the Progress note
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::UpdateProcessL( TInt aProgress, const TDesC& aProgressText )
    {
    if ( iProgressDialog )
        {
        iProgressDialog->SetTextL(aProgressText);
        iProgressInfo->SetAndDraw(aProgress);
        }
    }

// ---------------------------------------------------------------------------
// Close waitnote dialog
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::CloseWaitNoteL()
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::CloseWaitNoteL" );
    if( !iUSBOnGoing && !iIsEmbedded)
        {
        RProcess proc;
        proc.SetPriority( iPriority );
        // Fix for ESLU-7CFEPF, try to close the WaitNote even if it's not the current view
        TRAP_IGNORE(
            CMPXViewPlugin* pi =
                iViewUtility->ViewPluginManager().PluginL( TUid::Uid(KWaitNoteImpUid) );
            pi->DeactivateView();
            );
        }
    }


// -----------------------------------------------------------------------------
// Change the navi pane
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::UpdateReorderNaviPaneL()
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::UpdateReorderNaviPaneL" );
    delete iDuration;
    iDuration = NULL;

    // Set playlist counter text to pos/size by default
    CArrayFixFlat<TInt>* params =
        new ( ELeave ) CArrayFixFlat<TInt>( KMPXReorderNaviPaneGranularity );
    CleanupStack::PushL( params );
    // Position of selection in index
    params->AppendL( iContainer->CurrentLbxItemIndex() + 1 );
    // Total Number of items in lbx
    params->AppendL( iContainer->TotalListItemCount() );
    iDuration = StringLoader::LoadL(
        R_MPX_CUI_POSITION_COUNTER_TXT, *params );
    CleanupStack::PopAndDestroy( params );
    UpdateNaviPaneL();
    }

// ---------------------------------------------------------------------------
// Activates reorder mode
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::ActivateReorderGrabbedModeL()
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::ActivateReorderGrabbedModeL" );
    iIsGrabbed = ETrue;
    TInt currentItem( iContainer->CurrentLbxItemIndex() );
    iContainer->EnableFindBox( EFalse );
    iContainer->SetReorderGrabbedMode( ETrue, currentItem );
    if ( !iContainer->IsInReorderMode() )
        {
        iContainer->UpdateReorderTitleIconL();

        if ( iTitle )
            {
            delete iOriginalTitle;
            iOriginalTitle = NULL;
            iOriginalTitle = iTitle->AllocL();
            delete iTitle;
            iTitle = NULL;
            }
        iTitle = StringLoader::LoadL( R_QTN_NMP_TITLE_REORDER_LIST );
        UpdateTitlePaneL();

        if ( iDuration )
            {
            delete iOriginalDuration;
            iOriginalDuration = NULL;
            iOriginalDuration = iDuration->AllocL();
            delete iDuration;
            iDuration = NULL;
            }
        iContainer->ActivateReorderMode( ETrue );
        SetNewCbaL( R_MPX_CUI_REORDER_DROP_CANCEL_CBA );
        }
    iContainer->SetLbxCurrentItemIndexAndDraw( currentItem );
    UpdateReorderNaviPaneL();
    }

// ---------------------------------------------------------------------------
// Deactivates reorder mode
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::DeactivateReorderGrabbedModeL( TBool aExit )
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::DeactivateReorderGrabbedModeL" );
    iIsGrabbed = EFalse;
    delete iCurrentCba;
    iCurrentCba = NULL;

    iContainer->SetReorderGrabbedMode( EFalse );
    if ( aExit )
        {
        CEikButtonGroupContainer* cba = Cba();
        if ( cba )
            {
            cba->SetCommandSetL( R_AVKON_SOFTKEYS_OPTIONS_BACK );
            cba->DrawDeferred();

#ifdef __ENABLE_MSK
            // set middle softkey label display
            UpdateMiddleSoftKeyDisplayL( R_QTN_MSK_PLAY );
#endif // __ENABLE_MSK

            }

        iContainer->RestoreOriginalTitleIconL();
        delete iTitle;
        iTitle = NULL;
        if ( iOriginalTitle )
            {
            iTitle = iOriginalTitle->AllocL();
            delete iOriginalTitle;
            iOriginalTitle = NULL;
            }
        UpdateTitlePaneL();

        delete iDuration;
        iDuration = NULL;
        if ( iOriginalDuration )
            {
            iDuration = iOriginalDuration->AllocL();
            delete iOriginalDuration;
            iOriginalDuration = NULL;
            }
        if ( iViewUtility->ActiveViewType() == TUid::Uid( KMPXPluginTypeCollectionUid ) )
            {
            UpdateNaviPaneL();
            }
        iContainer->ActivateReorderMode( EFalse );
        iContainer->EnableFindBox( ETrue );
        }
    iContainer->HandleLbxItemAdditionPreserveIndexL();
    }

// -----------------------------------------------------------------------------
// Change the button group
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::SetNewCbaL( TInt aResId )
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::SetNewCbaL" );
    if ( !iCurrentCba )
        {
        iCurrentCba = CEikButtonGroupContainer::NewL(
            CEikButtonGroupContainer::ECba,
            CEikButtonGroupContainer::EHorizontal,
            this,
            aResId, *iContainer );
        }
    else
        {
        iCurrentCba->SetCommandSetL( aResId );
        iCurrentCba->DrawDeferred();
        }
    }

// -----------------------------------------------------------------------------
// Display the details dialog
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::DisplayDetailsDialogL( MDesC16Array& aDataArray,
    TInt aDialogResourceId, TInt aTitleResourceId )
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::DisplayDetailsDialogL" );
    CAknSingleHeadingPopupMenuStyleListBox* list =
        new ( ELeave ) CAknSingleHeadingPopupMenuStyleListBox;
    CleanupStack::PushL( list );
    CAknPopupList* popupList = CAknPopupList::NewL(
        list, R_AVKON_SOFTKEYS_OK_EMPTY,
        AknPopupLayouts::EMenuGraphicHeadingWindow);
    CleanupStack::PushL( popupList );
    list->ConstructL( popupList, CEikListBox::ELeftDownInViewRect );
    list->CreateScrollBarFrameL( ETrue );
    list->ScrollBarFrame()->SetScrollBarVisibilityL(
        CEikScrollBarFrame::EOff,
        CEikScrollBarFrame::EAuto);

    // Enable Marquee
    static_cast<CEikFormattedCellListBox*>( list )->ItemDrawer()->ColumnData()->
        EnableMarqueeL( ETrue );

    // Retrieve heading array
    CDesCArrayFlat* headingsArray(
        iCoeEnv->ReadDesCArrayResourceL( aDialogResourceId ) );
    CleanupStack::PushL( headingsArray );

    // Item array combines heading array and data array
    CDesCArrayFlat* itemArray =
        new ( ELeave ) CDesCArrayFlat( headingsArray->Count() );
    CleanupStack::PushL( itemArray );

    TInt count = headingsArray->Count();
    for ( TInt i = 0; i < count; i++ )
        {
        HBufC* item = HBufC::NewLC(
            headingsArray->MdcaPoint( i ).Length() +
            aDataArray.MdcaPoint( i ).Length() +
            KMPXDurationDisplayResvLen );

        TPtrC tempPtr1 = headingsArray->MdcaPoint( i );
        TPtrC tempPtr2 = aDataArray.MdcaPoint( i );

        item->Des().Format( KMPXCollDetailsItemsFormat,
                            &tempPtr1,
                            &tempPtr2 );

        itemArray->AppendL( *item );
        CleanupStack::PopAndDestroy( item );
        }

    CleanupStack::Pop( itemArray );
    CleanupStack::PopAndDestroy( headingsArray );

    // Set list items
    CTextListBoxModel* model = list->Model();
    model->SetOwnershipType( ELbmOwnsItemArray );
    model->SetItemTextArray( itemArray );

    // Set title
    HBufC* title = StringLoader::LoadLC( aTitleResourceId );
    popupList->SetTitleL( *title );
    CleanupStack::PopAndDestroy( title );

    // Show popup list
    CleanupStack::Pop( popupList );
    popupList->ExecuteLD();
    CleanupStack::PopAndDestroy( list );
    }

// -----------------------------------------------------------------------------
// Display collection details
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::DoShowCollectionDetailsL( const CMPXMedia& aMedia )
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::ShowCollectionDetailsL" );
    CDesCArrayFlat* dataArray =
        new ( ELeave ) CDesCArrayFlat( EMPXCollectionDetailsCount );
    CleanupStack::PushL( dataArray );

    // number of items
    HBufC* dataToAppend = HBufC::NewLC( KMPXMaxBufferLength );
    TInt songsCount( 0 );
    if ( aMedia.IsSupported( KMPXMediaColDetailNumberOfItems ) )
        {
        songsCount = aMedia.ValueTObjectL<TInt>( KMPXMediaColDetailNumberOfItems );
        }
    TPtr ptr( dataToAppend->Des() );
    ptr.AppendNum( songsCount );
    AknTextUtils::LanguageSpecificNumberConversion( ptr );
    dataArray->AppendL( ptr );
    CleanupStack::PopAndDestroy( dataToAppend );

    // total duration
    TInt duration( 0 );
    if ( aMedia.IsSupported( KMPXMediaColDetailDuration ) )
        {
        duration = aMedia.ValueTObjectL<TInt>( KMPXMediaColDetailDuration );
        }
    if ( duration > 0 )
        {
        dataToAppend = iCommonUiHelper->DisplayableDurationInTextL( duration/KMilliSecondsToSeconds );
        CleanupStack::PushL( dataToAppend );
        ptr.Set( dataToAppend->Des() );
        AknTextUtils::LanguageSpecificNumberConversion( ptr );
        dataArray->AppendL( ptr );
        CleanupStack::PopAndDestroy( dataToAppend );
        }
    else
        {
        dataArray->AppendL( KNullDesC );
        }

#ifdef RD_MULTIPLE_DRIVE
    RFs& fileSession( iCoeEnv->FsSession() );
    TDriveList driveList;
    TInt driveCount(0);
    TInt64 freePhoneMemory(KErrNotFound);
    TInt64 freeInternalMemory(KErrNotFound);
    TInt64 freeExternalMemory(KErrNotFound);
    TVolumeInfo volInfo;

    // Get all visible drives
    User::LeaveIfError( DriveInfo::GetUserVisibleDrives(
           fileSession, driveList, driveCount ) );
    MPX_DEBUG2 ("CMPXCollectionViewHgImp::ShowCollectionDetailsL - driveCount = %d", driveCount);

    for( TInt driveNum = EDriveA; driveNum <= EDriveZ; driveNum++ )
        {
        if (driveList[driveNum])
            {
            // Get the volume information
            if ( fileSession.Volume( volInfo, driveNum ) == KErrNone )
                {
                // Get the drive status
                TUint driveStatus(0);
                DriveInfo::GetDriveStatus( fileSession, driveNum, driveStatus );

                // Add up free memory depending on memory location
                if ( driveNum == EDriveC )
                    {
                    if ( freePhoneMemory == KErrNotFound )
                        {
                        freePhoneMemory = 0;
                        }
                    freePhoneMemory += volInfo.iFree;
                    }
                else if ( driveStatus & DriveInfo::EDriveInternal )
                    {
                    if ( freeInternalMemory == KErrNotFound )
                        {
                        freeInternalMemory = 0;
                        }
                    freeInternalMemory += volInfo.iFree;
                    }
                else if ( driveStatus &
                    (DriveInfo::EDriveRemovable | DriveInfo::EDriveRemote) )
                    {
                    if ( freeExternalMemory == KErrNotFound )
                        {
                        freeExternalMemory = 0;
                        }
                    freeExternalMemory += volInfo.iFree;
                    }
                }
            }
        }

    // phone memory free
    if ( freePhoneMemory != KErrNotFound )
        {
        dataToAppend = iCommonUiHelper->UnitConversionL(
            freePhoneMemory, ETrue );
        ptr.Set(dataToAppend->Des());
        AknTextUtils::LanguageSpecificNumberConversion( ptr);
        }
    else
        {
        dataToAppend = StringLoader::LoadL(
            R_MPX_CUI_COLLECTION_DETAILS_MEMORY_UNAVAILABLE );
        ptr.Set(dataToAppend->Des());
        }

    CleanupStack::PushL( dataToAppend );
    dataArray->AppendL( ptr );
    CleanupStack::PopAndDestroy( dataToAppend );

    // internal memory (mass storage) free
    if ( freeInternalMemory != KErrNotFound )
        {
        dataToAppend = iCommonUiHelper->UnitConversionL(
            freeInternalMemory, ETrue );
        ptr.Set(dataToAppend->Des());
        AknTextUtils::LanguageSpecificNumberConversion( ptr);
        }
    else
        {
        dataToAppend = StringLoader::LoadL(
            R_MPX_CUI_COLLECTION_DETAILS_MEMORY_UNAVAILABLE );
        ptr.Set(dataToAppend->Des());
        }

    CleanupStack::PushL( dataToAppend );
    dataArray->AppendL( ptr );
    CleanupStack::PopAndDestroy( dataToAppend );

    // removable/remote (memory card) memory free
    if ( freeExternalMemory != KErrNotFound )
        {
        dataToAppend = iCommonUiHelper->UnitConversionL(
            freeExternalMemory, ETrue );
        ptr.Set(dataToAppend->Des());
        AknTextUtils::LanguageSpecificNumberConversion( ptr);
        }
    else
        {
        dataToAppend = StringLoader::LoadL(
            R_MPX_CUI_COLLECTION_DETAILS_CARD_UNAVAILABLE_ITEM );
        ptr.Set(dataToAppend->Des());
        }
    CleanupStack::PushL( dataToAppend );
    dataArray->AppendL( ptr );
    CleanupStack::PopAndDestroy( dataToAppend );
#else
    // phone memory free
    HBufC* driveLetter = StringLoader::LoadLC( R_MPX_COLLECTION_PHONE_MEMORY_ROOT_PATH );
    RFs& fileSession( iCoeEnv->FsSession() );
    TVolumeInfo volInfo;
    TDriveUnit driveUnit( *driveLetter ); // Get the drive
    CleanupStack::PopAndDestroy( driveLetter );
    if ( KErrNone == fileSession.Volume( volInfo, ( TInt )driveUnit ) )
        {
        dataToAppend = iCommonUiHelper->UnitConversionL( volInfo.iFree, ETrue );
        ptr.Set(dataToAppend->Des());
        AknTextUtils::LanguageSpecificNumberConversion( ptr);
        }
    else
        {
        dataToAppend = StringLoader::LoadL(
            R_MPX_CUI_COLLECTION_DETAILS_CARD_UNAVAILABLE_ITEM );
        ptr.Set(dataToAppend->Des());
        }
    CleanupStack::PushL( dataToAppend );
    dataArray->AppendL( ptr );
    CleanupStack::PopAndDestroy( dataToAppend );

    // memory card
    driveLetter = StringLoader::LoadLC( R_MPX_COLLECTION_MEMORY_CARD_ROOT_PATH );
    driveUnit = *driveLetter; // Get the drive
    CleanupStack::PopAndDestroy( driveLetter );
    if ( fileSession.Volume( volInfo, ( TInt )driveUnit ) == KErrNone )
        {
        dataToAppend = iCommonUiHelper->UnitConversionL( volInfo.iFree, ETrue );
        ptr.Set(dataToAppend->Des());
        AknTextUtils::LanguageSpecificNumberConversion( ptr);
        }
    else
        {
        dataToAppend = StringLoader::LoadL(
            R_MPX_CUI_COLLECTION_DETAILS_CARD_UNAVAILABLE_ITEM );
        ptr.Set(dataToAppend->Des());
        }
    CleanupStack::PushL( dataToAppend );
    dataArray->AppendL( ptr );
    CleanupStack::PopAndDestroy( dataToAppend );
#endif // RD_MULTIPLE_DRIVE

    // last refreshed
    TInt64 lastRefreshed( 0 );
    if ( aMedia.IsSupported( KMPXMediaColDetailLastRefreshed ) )
        {
        lastRefreshed = aMedia.ValueTObjectL<TInt64>( KMPXMediaColDetailLastRefreshed );
        }
    TTime time( lastRefreshed );
    dataToAppend = HBufC::NewLC(
        KMPXMaxTimeLength + KMPXDurationDisplayResvLen );
    HBufC* format( StringLoader::LoadLC( R_QTN_DATE_USUAL_WITH_ZERO ) );
    TPtr modDatePtr( dataToAppend->Des() );
    time.FormatL( modDatePtr, *format );
    CleanupStack::PopAndDestroy( format );
    AknTextUtils::LanguageSpecificNumberConversion( modDatePtr );
    dataArray->AppendL( modDatePtr );
    CleanupStack::PopAndDestroy( dataToAppend );

    DisplayDetailsDialogL( *dataArray,
        R_MPX_CUI_COLLECTION_DETAILS_HEADINGS,
        R_MPX_QTN_NMP_TITLE_COLLECTION_DETAILS );
    CleanupStack::PopAndDestroy( dataArray );
    }

// -----------------------------------------------------------------------------
// Display playlist details
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::DoShowPlaylistDetailsL( const CMPXMedia& aMedia )
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::ShowPlaylistDetailsL" );
    CDesCArrayFlat* dataArray =
        new ( ELeave ) CDesCArrayFlat( EMPXPlaylistDetailsCount );
    CleanupStack::PushL( dataArray );

    // playlist name
    if ( aMedia.IsSupported( KMPXMediaGeneralTitle ) )
        {
        dataArray->AppendL( aMedia.ValueText( KMPXMediaGeneralTitle ) );
        }
    else if ( aMedia.IsSupported( KMPXMediaGeneralUri ) )
        {
        TParsePtrC fileDetail( aMedia.ValueText( KMPXMediaGeneralUri ) );
        dataArray->AppendL( fileDetail.Name() );
        }
    else
        {
        dataArray->AppendL( KNullDesC );
        }

    // number of songs
    TInt songsCount( 0 );
    if ( aMedia.IsSupported( KMPXMediaGeneralCount ) )
        {
        songsCount = aMedia.ValueTObjectL<TInt>( KMPXMediaGeneralCount );
        }
    HBufC* dataToAppend = HBufC::NewLC( KMPXMaxBufferLength );
    TPtr ptr( dataToAppend->Des() );
    ptr.AppendNum( songsCount );
    AknTextUtils::LanguageSpecificNumberConversion( ptr );
    dataArray->AppendL( ptr );
    CleanupStack::PopAndDestroy( dataToAppend );

    // Duration
    TInt duration( 0 );
    if ( aMedia.IsSupported( KMPXMediaGeneralDuration ) )
        {
        duration = aMedia.ValueTObjectL<TInt>( KMPXMediaGeneralDuration );
        }
    if ( duration > 0 )
        {
        dataToAppend = iCommonUiHelper->DisplayableDurationInTextL( duration/KMilliSecondsToSeconds );
        CleanupStack::PushL( dataToAppend );
        ptr.Set( dataToAppend->Des() );
        AknTextUtils::LanguageSpecificNumberConversion( ptr );
        dataArray->AppendL( ptr );
        CleanupStack::PopAndDestroy( dataToAppend );
        }
    else
        {
        dataArray->AppendL( KNullDesC );
        }

    // Location
    TUint flags( aMedia.ValueTObjectL<TUint>( KMPXMediaGeneralFlags ) );
    TUint isVirtual( ( flags ) & ( KMPXMediaGeneralFlagsIsVirtual ) );
    if ( !isVirtual )
        {
        if ( aMedia.IsSupported( KMPXMediaGeneralUri ) )
            {
            dataArray->AppendL( aMedia.ValueText( KMPXMediaGeneralUri ) );
            }
        else
            {
            dataArray->AppendL( KNullDesC );
            }
        }

    // last refreshed
    TInt64 lastMod( 0 );
    if ( aMedia.IsSupported( KMPXMediaGeneralDate ) )
        {
        lastMod = aMedia.ValueTObjectL<TInt64>( KMPXMediaGeneralDate );
        }
    TTime time( lastMod );
    dataToAppend = HBufC::NewLC(
        KMPXMaxTimeLength + KMPXDurationDisplayResvLen );
    HBufC* format = StringLoader::LoadLC( R_QTN_DATE_USUAL_WITH_ZERO );
    ptr.Set( dataToAppend->Des() );
    time.FormatL( ptr, *format );
    CleanupStack::PopAndDestroy( format );
    AknTextUtils::LanguageSpecificNumberConversion( ptr );
    dataArray->AppendL( ptr );
    CleanupStack::PopAndDestroy( dataToAppend );

    dataToAppend = HBufC::NewLC(
        KMPXMaxTimeLength + KMPXDurationDisplayResvLen );
    format = StringLoader::LoadLC( R_QTN_TIME_USUAL );
    ptr.Set( dataToAppend->Des() );
    time.FormatL( ptr, *format );
    CleanupStack::PopAndDestroy( format );
    AknTextUtils::LanguageSpecificNumberConversion( ptr );
    dataArray->AppendL( ptr );
    CleanupStack::PopAndDestroy( dataToAppend );

    TInt headingResource( isVirtual ?
        R_MPX_CUI_PLAYLIST_DETAILS_HEADINGS_WITHOUT_URI :
        R_MPX_CUI_PLAYLIST_DETAILS_HEADINGS_WITH_URI );
    DisplayDetailsDialogL( *dataArray, headingResource,
        R_MPX_QTN_NMP_TITLE_PLAYLIST_DETAILS );
    CleanupStack::PopAndDestroy( dataArray );
    }


// ---------------------------------------------------------------------------
// Handles Upnp menus from DynInitMenuPaneL()
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::HandleDynInitUpnpL(
    TInt aResourceId,
    CEikMenuPane& aMenuPane )
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::HandleDynInitUpnpL()" );

    if ( !IsUpnpVisible() )
        {
        GetCurrentPlayerDetails();

        if ( iCurrentPlayerType == EPbLocal )
            {
            aMenuPane.SetItemDimmed(
                EMPXCmdUpnpPlayVia,
                ETrue);
            }
        aMenuPane.SetItemDimmed(
            EMPXCmdUPnPAiwCmdCopyToExternalCriteria,
            ETrue);
        }
    else
        {
        MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleDynInitUpnpL(): UPnP visible and media" );
        TInt currentItem( iContainer->CurrentLbxItemIndex() );

        const CMPXMedia& media =
            (iContainer->ListBoxArray())->MediaL( currentItem );
        TMPXGeneralType type( EMPXNoType );
        if (media.IsSupported(KMPXMediaGeneralType))
            {
            type =
                media.ValueTObjectL<TMPXGeneralType>(KMPXMediaGeneralType);
            }

        if ( ( type == EMPXItem ) ||
             ( type == EMPXGroup ) )
            {
            MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleDynInitUpnpL(): folder or song" );
            if ( iErrorAttachCopyMenu != KErrNone )
                {
                MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleDynInitUpnpL(): error, Dim Copy" );
                aMenuPane.SetItemDimmed(
                    EMPXCmdUPnPAiwCmdCopyToExternalCriteria,
                    ETrue);
                }
            else
                {
                if (iServiceHandler->HandleSubmenuL(aMenuPane))
                    {
                    return;
                    }

                if ( iServiceHandler->IsAiwMenu(aResourceId))
                    {
                    MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleDynInitUpnpL(): Aiw menu" );
                    CAiwGenericParamList& in = iServiceHandler->InParamListL();

                    iServiceHandler->InitializeMenuPaneL(aMenuPane, aResourceId, EMPXCmdUPnPAiwCmdCopyToExternalCriteria, in);
                    MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleDynInitUpnpL(): after InitializeMenuPaneL" );
                    }
                }
            }
         else
            {
            aMenuPane.SetItemDimmed(
                EMPXCmdUpnpPlayVia,
                ETrue);
            aMenuPane.SetItemDimmed(
                EMPXCmdUPnPAiwCmdCopyToExternalCriteria,
                ETrue);
            }
        }
    }

// -----------------------------------------------------------------------------
// CMPXCollectionViewHgImp::IsUpnpVisible
// Checks if UPnP access point is defined
// -----------------------------------------------------------------------------
//
TBool CMPXCollectionViewHgImp::IsUpnpVisible()
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::IsUpnpVisible" );
 	  TBool returnValue = EFalse;

   	if ( iUpnpCopyCommand  && iUpnpFrameworkSupport)
        {
        returnValue = iUpnpCopyCommand->IsAvailableL();
        }
    return returnValue;
    }

// -----------------------------------------------------------------------------
// CMPXCollectionViewHgImp::AddPlayersNamesToMenuL
// Taken from Gallery upnp support implementation
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::AddPlayersNamesToMenuL( CEikMenuPane& aMenuPane )
    {
    RArray<TMPXPlaybackPlayerType> playerTypes;
    CleanupClosePushL(playerTypes);

    MMPXPlayerManager& manager = iPlaybackUtility->PlayerManager();
    manager.GetPlayerTypesL(playerTypes);

    GetCurrentPlayerDetails();

    TInt countPlayersTypes( playerTypes.Count() );
    TInt countLocalType(0);
    TInt countRemoteType(0);

    if ( countPlayersTypes >= 1 )
        {
        iPlayersList.Close();

        for ( TInt i = 0; i < countPlayersTypes; i++ )
            {
            MPX_DEBUG3( "playerTypes[%d]: %d", i, playerTypes[i] );
            switch (playerTypes[i])
                {
                case EPbLocal:
                    {
                    // we only show 1 specific type once in the menu
                    if ( countLocalType == 0 )
                        {
                        AddPlayerNameToMenuL( aMenuPane,
                                            EMPXCmdUpnpPlayViaLocal,
                                            manager,
                                            playerTypes[i] );

                        countLocalType++;
                        }
                    break;
                    }
                case EPbRemote:
                    {
                    // we only show 1 specific type once in the menu
                    if ( countRemoteType == 0 )
                        {
                        AddPlayerNameToMenuL( aMenuPane,
                                            EMPXCmdUpnpPlayViaRemotePlayer,
                                            manager,
                                            playerTypes[i] );
                        countRemoteType++;
                        }
                    break;
                    }
                default:
                    {
                    // default case is handled in the next loop, we want
                    // to add any "other" player at the end of the list
                    break;
                    }
                }
            } // for loop

        for ( TInt i = 0; i < countPlayersTypes; i++ )
            {
            MPX_DEBUG3( "playerTypes[%d]: %d", i, playerTypes[i] );
            // EPbLocal and EPbRemote were already added to the
            // submenu in the previous loop
            if ( playerTypes[i] != EPbLocal &&
                 playerTypes[i] != EPbRemote )
                {
                // EPbUnknown or else
                TBool alreadyInTheList( EFalse );

                for ( TInt j = 0; j < i; j++)
                    {
                    // if the new playertype is already in the list
                    if ( playerTypes[i] == playerTypes[j] )
                        {
                        alreadyInTheList = ETrue;
                        break;
                        }
                    }

                if ( !alreadyInTheList )
                    {
                    HBufC* buf = manager.PlayerTypeDisplayNameL(playerTypes[i]);

                    if ( buf )
                        {
                        CleanupStack::PushL(buf);
                        AddPlayerNameToMenuL( aMenuPane,
                                            EMPXCmdUpnpPlayViaRemotePlayer,
                                            manager,
                                            playerTypes[i],
                                            *buf );
                        CleanupStack::PopAndDestroy(buf);
                        }
                    // else we don't do anything. other player type is not
                    // currently supported. Implementation will be finalized
                    // when the requirement is defined.
                    }
                }
            }
        }

    CleanupStack::PopAndDestroy(&playerTypes);

    if ( iPlayersList.Count() <= 1 )
        {
        aMenuPane.SetItemDimmed( EMPXCmdUpnpPlayViaRemotePlayer,
                                  ETrue );
        }
    }

// -----------------------------------------------------------------------------
// CMPXCollectionViewHgImp::AddPlayerNameToMenuL
// Taken from Gallery upnp support implementation
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::AddPlayerNameToMenuL( CEikMenuPane& aMenuPane,
                                                TInt aCommandId,
                                                MMPXPlayerManager& aPlayerManager,
                                                TMPXPlaybackPlayerType& aPlayerType,
                                                const TDesC& aMenuText )
    {
    RArray<TUid> players;
    CleanupClosePushL(players);
    aPlayerManager.GetPlayerListL(players, aPlayerType);

    // For now we only keep the first player we find
    // Local player is always the first one in the list
    // Ui spec limitation
    MPX_DEBUG2( "players[0]: %d", players[0].iUid );
    if ( aCommandId == EMPXCmdUpnpPlayViaLocal )
        {
        iPlayersList.Insert(players[0], 0);
        }
    else if ( ( aCommandId == EMPXCmdUpnpPlayViaRemotePlayer ) &&
              (iPlayersList.Count() > 1) )
        {
        iPlayersList.Insert(players[0], 1);
        }
    else
        {
        iPlayersList.AppendL(players[0]);
        }
    CleanupStack::PopAndDestroy(&players);

    // if the player is of unknown type
    if ( ( aCommandId != EMPXCmdUpnpPlayViaRemotePlayer ) &&
         ( aCommandId != EMPXCmdUpnpPlayViaLocal ) )
        {
        CEikMenuPaneItem::SData menuItem;
        menuItem.iText.Copy( aMenuText );
        menuItem.iCascadeId = 0;
        menuItem.iFlags = EEikMenuItemRadioEnd;

        menuItem.iCommandId = aCommandId + (iPlayersList.Count() - 1);
        aCommandId = menuItem.iCommandId;

        aMenuPane.AddMenuItemL( menuItem );
        }

    if ( iCurrentPlayerType == aPlayerType )
        {
        aMenuPane.SetItemButtonState( aCommandId, EEikMenuItemSymbolOn );
        }
    }

// -----------------------------------------------------------------------------
// CMPXCollectionViewHgImp::GetCurrentPlayerDetails
// Retrieves the current player name and type
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::GetCurrentPlayerDetails()
    {
    MMPXPlayerManager& manager = iPlaybackUtility->PlayerManager();
    TUid currentlyUsedPlayer;
    TInt currentlyUsedSubPlayer;
    iCurrentPlayerType = EPbLocal;
    delete iSubPlayerName;
    iSubPlayerName = NULL;
    TRAP_IGNORE( manager.GetSelectionL( iCurrentPlayerType,
                                        currentlyUsedPlayer,
                                        currentlyUsedSubPlayer,
                                        iSubPlayerName));
    }

// -----------------------------------------------------------------------------
// CMPXCollectionViewHgImp::SelectNewPlayerL
// Selects a new player for audio playback
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::SelectNewPlayerL( TInt aCommand )
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::SelectNewPlayerL()" );
    MPX_DEBUG2( "CMPXCollectionViewHgImp::SelectNewPlayerL(%d)", aCommand );

    TInt errorSelectPlayer( KErrCancel );

    switch (aCommand)
        {
        case EMPXCmdUpnpPlayViaLocal:
            {
            // if Local is not already the current player, select it
            if ( iCurrentPlayerType != EPbLocal )
                {
                MMPXPlayerManager& manager = iPlaybackUtility->PlayerManager();
                MPX_TRAP( errorSelectPlayer, manager.ClearSelectPlayersL() );
                }
            else // no need to reselect it but always start playback
                {
                errorSelectPlayer = KErrNone;
                }
            break;
            }
        default:
            {
            if ( aCommand >= EMPXCmdUpnpPlayViaRemotePlayer )
                {
                HBufC* buf = HBufC::NewLC( KMaxUidName );
                buf->Des().AppendNum(
                     (iPlayersList[aCommand -
                                   EMPXCmdUpnpPlayViaLocal]).iUid );

                // ActivateViewL leaves with KErrCancel if the dialog is
                // cancelled
                // ActivateViewL leaves with KErrInUse if the selected player
                // is already the active player
                MPX_TRAP(errorSelectPlayer, iViewUtility->ActivateViewL(
                                TUid::Uid( KMPXPluginTypeUPnPBrowseDialogUid ),
                                buf ));
                CleanupStack::PopAndDestroy( buf );
                }
            break;
            }
        }

    GetCurrentPlayerDetails();

    // If InUse, the player selected is already the current one, we start playback anyway
    // contrary to Playback view
    if ( ( errorSelectPlayer == KErrNone ) ||
         ( errorSelectPlayer == KErrInUse ) )
        {
        // Starts playback by calling OpenL() for the selected track
        CMPXCommonListBoxArrayBase* array = iContainer->ListBoxArray();
        if ( array && ( iContainer->TotalListItemCount() > 0 ) )
            {
            MPX_DEBUG1( "CMPXCollectionViewHgImp::SelectNewPlayerL() before MediaL()" );

            TInt currentListBoxItemIndex(
                iContainer->CurrentLbxItemIndex() );

            if ( currentListBoxItemIndex >= 0 )
                {
                const CMPXMedia& media = array->MediaL( currentListBoxItemIndex );

                TMPXGeneralType type( EMPXNoType );
                TMPXGeneralCategory category( EMPXNoCategory );

                if ( media.IsSupported( KMPXMediaGeneralType ) )
                    {
                    type = media.ValueTObjectL<TMPXGeneralType>( KMPXMediaGeneralType );
                    }

                if ( media.IsSupported( KMPXMediaGeneralCategory ) )
                    {
                    category = media.ValueTObjectL<TMPXGeneralCategory>(
                                    KMPXMediaGeneralCategory );
                    }

                MPX_DEBUG2( "CMPXCollectionViewHgImp::SelectNewPlayerL() currentIndex %d", currentListBoxItemIndex );

                // Needed to reset the status of iPreservedState
                iPlaybackUtility->CommandL(EPbCmdResetPreserveState);

                if ( ( type == EMPXItem ) && ( category == EMPXSong ) )
                    {
                    MPX_DEBUG1( "CMPXCollectionViewHgImp::SelectNewPlayerL() type is EMPXItem" );
                    if(iCollectionCacheReady)
                        {
                        iCollectionUtility->Collection().OpenL( currentListBoxItemIndex );
						iFirstIncrementalBatch = ETrue;
                        }
                    }
                else if ( ( type == EMPXItem ) && ( category == EMPXPlaylist ) )
                    {
                    MPX_DEBUG1( "CMPXCollectionViewHgImp::SelectNewPlayerL() category is EMPXPlaylist" );
                    // if we want to play a playlist, we need to find out
                    // if it's empty first
                    ASSERT( iCurrentFindAllLOp == EMPXOpFindAllLIdle );

                    TMPXItemId id(
                        media.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) );
                    CMPXMedia* entry = CMPXMedia::NewL();
                    CleanupStack::PushL( entry );
                    entry->SetTObjectValueL<TMPXGeneralType>(
                        KMPXMediaGeneralType, EMPXGroup );
                    entry->SetTObjectValueL<TMPXGeneralCategory>(
                        KMPXMediaGeneralCategory, EMPXSong );
                    entry->SetTObjectValueL<TMPXItemId>(
                        KMPXMediaGeneralId, id );
                    RArray<TMPXAttribute> attrs;
                    CleanupClosePushL( attrs );
                    attrs.Append( KMPXMediaGeneralId );
                    iCollectionUtility->Collection().FindAllL(
                                            *entry, attrs.Array(), *this );
                    iCurrentFindAllLOp = EMPXOpFindAllLUpnpPlayback;

                    CleanupStack::PopAndDestroy( &attrs );
                    CleanupStack::PopAndDestroy( entry );
                    }
                else // if a folder is selected
                    {
                    MPX_DEBUG1( "CMPXCollectionViewHgImp::SelectNewPlayerL() type is EMPXGroup" );
                    if(iCollectionCacheReady)
                        {
                        iCollectionUtility->Collection().OpenL( currentListBoxItemIndex,
                                                            EMPXOpenPlaylistOnly);
						iFirstIncrementalBatch = ETrue;
                        }
                    }
                }
            }
        }
    else if ( errorSelectPlayer != KErrCancel )
        {
        User::LeaveIfError(errorSelectPlayer);
        }
    }

// -----------------------------------------------------------------------------
// CMPXCollectionViewHgImp::CopySelectedItemsToRemoteL
// Copies selected file(s) to remote player
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::CopySelectedItemsToRemoteL()
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::CopySelectedItemsToRemoteL()" );

    TInt index( iContainer->CurrentLbxItemIndex() );
    if ( index >= 0 )
        {
        CMPXCommonListBoxArrayBase* array = iContainer->ListBoxArray();
        const CMPXMedia& media = array->MediaL( index );

        TMPXGeneralType type( EMPXNoType );
        TMPXGeneralCategory category( EMPXNoCategory );

       if ( media.IsSupported( KMPXMediaGeneralType ) )
            {
            type =
                media.ValueTObjectL<TMPXGeneralType>( KMPXMediaGeneralType );
            }
        if ( media.IsSupported( KMPXMediaGeneralCategory ) )
            {
            category =
                media.ValueTObjectL<TMPXGeneralCategory>( KMPXMediaGeneralCategory );
            }

        CMPXCollectionPath* cpath =
                              iCollectionUtility->Collection().PathL();
        CleanupStack::PushL( cpath );

        if ( ( type == EMPXItem ) && ( category == EMPXSong ) )
            {
            const CArrayFix<TInt>* arrayIndex =
                iContainer->CurrentSelectionIndicesL();
            TInt arrayCount( arrayIndex->Count() );

            cpath->ClearSelection();
            if ( arrayCount > 0 )
                {
                for (TInt index=0; index < arrayCount; index++)
                    {
                    cpath->SelectL(arrayIndex->At(index));
                    }
                }
            else
                {
                cpath->Set( index );
                }

            // Ask for the list of selected song paths: will return in HandleMedia()
            ASSERT( iCurrentMediaLOp == EMPXOpMediaLIdle );
            RArray<TMPXAttribute> attrs;
            CleanupClosePushL(attrs);
            attrs.Append( KMPXMediaGeneralUri );
            iCollectionUtility->Collection().MediaL( *cpath, attrs.Array() );
            iCurrentMediaLOp = EMPXOpMediaLCopyToRemote;
            CleanupStack::PopAndDestroy( &attrs );
            }
        else // if a folder is selected
            {
            TMPXItemId id(0);
            if ( media.IsSupported( KMPXMediaGeneralId ) )
                {
                id = media.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId );
                }

            RArray<TInt> supportedIds;
            CleanupClosePushL(supportedIds);
            supportedIds.AppendL(KMPXMediaIdGeneral);

            CMPXMedia* entry = CMPXMedia::NewL(supportedIds.Array());
            CleanupStack::PushL(entry);
            entry->SetTObjectValueL( KMPXMediaGeneralType, EMPXGroup );

            entry->SetTObjectValueL( KMPXMediaGeneralCategory, EMPXSong );

            entry->SetTObjectValueL( KMPXMediaGeneralId, id );

            if ( category == EMPXAlbum )
                {
                const CMPXMedia& containerMedia = array->ContainerMedia();
                TMPXGeneralCategory containerCategory( EMPXNoCategory );
                if ( containerMedia.IsSupported( KMPXMediaGeneralCategory ) )
                    {
                    containerCategory = containerMedia.ValueTObjectL<TMPXGeneralCategory>(
                                                KMPXMediaGeneralCategory );
                    }

                if ( containerCategory == EMPXArtist )
                    {
                    // artist/album level, need to specify artist ID in container ID
                    TMPXItemId containerId =
                        containerMedia.ValueTObjectL<TMPXItemId>(
                            KMPXMediaGeneralId );
                    entry->SetTObjectValueL<TMPXItemId>(
                        KMPXMediaGeneralContainerId, containerId );
                    }
                }

            RArray<TMPXAttribute> attrs;
            CleanupClosePushL(attrs);
            attrs.Append( KMPXMediaGeneralUri );

            ASSERT( iCurrentFindAllLOp == EMPXOpFindAllLIdle );
            iCollectionUtility->Collection().FindAllL( *entry,
                                                       attrs.Array(),
                                                       *this );
            iCurrentFindAllLOp = EMPXOpFindAllLUpnp;

            CleanupStack::PopAndDestroy( &attrs );
            CleanupStack::PopAndDestroy( entry );
            CleanupStack::PopAndDestroy( &supportedIds );
            }
        CleanupStack::PopAndDestroy( cpath );
        }
    }

// -----------------------------------------------------------------------------
// CMPXCollectionViewHgImp::DoHandleCopyToRemoteL
// Handle call back from collectionframework for Copy to Remote command
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::DoHandleCopyToRemoteL(
    const CMPXMedia& aMedia, TBool aComplete )
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::DoHandleCopyToRemoteL()");

    CMPXMediaArray* mediaArray( NULL );
    TInt fileCount( 0 );

    if ( aMedia.IsSupported( KMPXMediaArrayContents ) )
        {
        mediaArray =
            aMedia.Value<CMPXMediaArray>( KMPXMediaArrayContents );
        if ( mediaArray )
            {
            fileCount = mediaArray->Count();
            }
        }
    MPX_DEBUG2("CMPXCollectionViewHgImp::DoHandleCopyToRemoteL Entry count = %d", fileCount);

    // Change this to Global will be needed if FindAll() is called
    // repeatedly until aComplete is ETrue (Inc9?)
    CAiwGenericParamList* aiwCopyInParamList = CAiwGenericParamList::NewLC();

    // multiple files or folder
    if ( fileCount > 0 )
        {
        if ( mediaArray )
            {
            for ( TInt i = 0; i < fileCount; i++ )
                {
                CMPXMedia* media( mediaArray->AtL( i ) );

                const TDesC& location =
                    media->ValueText( KMPXMediaGeneralUri );
                MPX_DEBUG3( "CMPXCollectionViewHgImp::DoHandleCopyToRemote %d filePath = %S", i, &location );

                TAiwVariant path( location );
                TAiwGenericParam fileParameter( EGenericParamFile,
                                                path );
                aiwCopyInParamList->AppendL( fileParameter );
                }
            }
        }
    else // single file
        {
        TMPXGeneralType type( EMPXNoType );

        if ( aMedia.IsSupported( KMPXMediaGeneralType ) )
            {
            type = aMedia.ValueTObjectL<TMPXGeneralType>( KMPXMediaGeneralType );
            }

        if ( type == EMPXItem )
            {
            const TDesC& location =
                aMedia.ValueText( KMPXMediaGeneralUri );
            TAiwVariant path( location );
            MPX_DEBUG2( "CMPXCollectionViewHgImp::DoHandleCopyToRemote filePath = %S", &location );

            TAiwGenericParam fileParameter( EGenericParamFile, path );
            aiwCopyInParamList->AppendL( fileParameter );
            }
        }

    if ( ( aiwCopyInParamList->Count() > 0 ) &&
         aComplete )
        {
        CAiwGenericParamList* outParamList = CAiwGenericParamList::NewLC();
        // do not allow the copy dialog to be dismissed by external command
        HandleCommandL( EMPXCmdIgnoreExternalCommand );
        iServiceHandler->ExecuteMenuCmdL(
                  EMPXCmdUPnPAiwCmdCopyToExternalCriteria, /* command id */
                  *aiwCopyInParamList,   /* in parameters */
                  *outParamList,          /* out parameters */
                  0,                      /* options */
                  NULL );                 /* call back */
        HandleCommandL( EMPXCmdHandleExternalCommand );

        CleanupStack::PopAndDestroy( outParamList );
        }

    // Clear selection
    if( iContainer )
        {
        iContainer->ClearLbxSelection();
        }

    CleanupStack::PopAndDestroy( aiwCopyInParamList );
    }

// -----------------------------------------------------------------------------
// Find playlists
// -----------------------------------------------------------------------------
//
TInt CMPXCollectionViewHgImp::FindPlaylistsL()
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::FindPlaylistsL" );
    TInt entriesCount( 0 );
    delete iUserPlaylists;
    iUserPlaylists = NULL;
    iUserPlaylists = iCommonUiHelper->FindPlaylistsL();

    if ( iUserPlaylists )
        {
        const CMPXMediaArray* mediaArray =
            iUserPlaylists->Value<CMPXMediaArray>( KMPXMediaArrayContents );
        User::LeaveIfNull(const_cast<CMPXMediaArray*>(mediaArray));

        entriesCount = mediaArray->Count();
        MPX_DEBUG2( "CMPXCollectionViewHgImp::FindPlaylistsL Entry count = %d", entriesCount );
        }
    else
        {
        MPX_DEBUG1( "CMPXCollectionViewHgImp::FindPlaylistsL Error getting playlist" );
        User::Leave( KErrNotFound );
        }
    return entriesCount;
    }

// -----------------------------------------------------------------------------
// Save the playlist after reorder
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::SaveCurrentPlaylistL()
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::SaveCurrentPlaylistL" );
    CMPXCommonListBoxArrayBase* listboxArray =
        iContainer->ListBoxArray();
    TInt currentIndex( iContainer->CurrentLbxItemIndex() );
    TInt origIndex( iContainer->GetOriginalIndex() );
    const CMPXMedia& media( listboxArray->MediaL( origIndex ) );
    TMPXItemId id( media.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) );
    const CMPXMedia& containerMedia = listboxArray->ContainerMedia();
    TMPXItemId playlistId( containerMedia.ValueTObjectL<TMPXItemId>(
        KMPXMediaGeneralId ) );
    MPX_DEBUG4( "CMPXCollectionViewHgImp::SaveCurrentPlaylistL song 0x%x is moved from %d to %d",
         id.iId1, origIndex, currentIndex );
    MPX_DEBUG2( "CMPXCollectionViewHgImp::SaveCurrentPlaylistL playlist ID 0x%x", playlistId.iId1 );
    iIsSavingReorderPlaylist = ETrue;
    iCollectionUiHelper->ReorderPlaylistL(
        playlistId, id, origIndex, currentIndex, this );
    iCurrentHighlightedIndex = currentIndex;
    }

// -----------------------------------------------------------------------------
// Handles rename operation complete
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::HandleRenameOpCompleteL()
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::HandleRenameOpCompleteL" );
    iSetMediaLCount = KErrNotFound;
    MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleRenameOpCompleteL dismiss wait note" );
    iCommonUiHelper->DismissWaitNoteL();
    HandleCommandL( EMPXCmdHandleExternalCommand );
    if ( iInvalidFileExist )
        {
        // there are invalid files, diplay info note
        HBufC* string = StringLoader::LoadLC(
            R_MPX_COLLECTION_NOTE_RENAME_WITH_INVALID, *iNewName );
        iCommonUiHelper->DisplayInfoNoteL( *string );
        CleanupStack::PopAndDestroy( string );
        }
    MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleRenameOpCompleteL calling OpenL" );
    // path changed messages were ignored during rename, need to
    // manually refresh the screen
    DoIncrementalOpenL();
    }

// -----------------------------------------------------------------------------
// checks if send option should be shown
// -----------------------------------------------------------------------------
//
TBool CMPXCollectionViewHgImp::SendOptionVisibilityL()
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::SendOptionVisibilityL" );
    TBool isHidden( iContainer->TotalListItemCount() < 1 );

    if ( !isHidden )
        {
        CMPXCommonListBoxArrayBase* baseArray =
            iContainer->ListBoxArray();
        CMPXCollectionViewListBoxArray* array =
            static_cast<CMPXCollectionViewListBoxArray*>( baseArray );
        TInt selectionCount( 0 );
        if ( iSelectionIndexCache)
            {
            selectionCount = iSelectionIndexCache->Count();
            }

        if ( selectionCount > 0 )
            {
            TBool isValid( EFalse );
            for ( TInt i = 0; i < selectionCount && !isValid; i++ )
                {
                // multiple selection
                isValid = !array->IsItemBrokenLinkL(
                    iSelectionIndexCache->At( i ) );
                isValid = isValid &&
                    !array->IsItemCorruptedL(
                    iSelectionIndexCache->At( i ));
                }
            // if anything is valid, display the item
            isHidden = !isValid;
            }
        else
            {
            //single selection
            isHidden = array->IsItemBrokenLinkL(
                iContainer->CurrentLbxItemIndex() );
            isHidden = isHidden ||
                array->IsItemCorruptedL(
                iContainer->CurrentLbxItemIndex() );
            }
        }

    return isHidden;
    }

// -----------------------------------------------------------------------------
// Checks if Set as ringtone option should be shown
// -----------------------------------------------------------------------------
//
TBool CMPXCollectionViewHgImp::SetAsRingToneOptionVisibilityL()
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::SetAsRingToneOptionVisibilityL" );
    TBool isHidden( iContainer->TotalListItemCount() < 1 );

    if ( !isHidden )
        {
        CMPXCollectionViewListBoxArray* array =
            static_cast<CMPXCollectionViewListBoxArray*>(
            iContainer->ListBoxArray() );
        const CMPXMedia& media =
            array->MediaL( iContainer->CurrentLbxItemIndex() );

        // if item is not yet fetched from database, assume that it's valid
        if ( !( media.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) ==
            KMPXInvalidItemId ) )
            {
            CMPXMedia* criteria = CMPXMedia::NewL();
            CleanupStack::PushL( criteria );
            RArray<TMPXAttribute> attrs;
            CleanupClosePushL( attrs );
            attrs.Append( KMPXMediaGeneralUri );
            attrs.Append( KMPXMediaDrmProtected );
            attrs.Append( KMPXMediaDrmCanSetAutomated );
            criteria->SetTObjectValueL<TMPXGeneralType>(
                KMPXMediaGeneralType,
                media.ValueTObjectL<TMPXGeneralType>( KMPXMediaGeneralType ) );
            criteria->SetTObjectValueL<TMPXGeneralCategory>(
                KMPXMediaGeneralCategory,
                media.ValueTObjectL<TMPXGeneralCategory>( KMPXMediaGeneralCategory ) );
            if ( media.IsSupported( KMPXMediaGeneralCollectionId ) )
                {
                criteria->SetTObjectValueL<TUid>(
                    KMPXMediaGeneralCollectionId,
                    media.ValueTObjectL<TUid>( KMPXMediaGeneralCollectionId ) );
                }
            else
                {
                CMPXCollectionPath* path( iCollectionUtility->Collection().PathL() );
                CleanupStack::PushL( path );
                criteria->SetTObjectValueL<TUid>(
                    KMPXMediaGeneralCollectionId,
                    TUid::Uid( path->Id( 0 ) ) );
                CleanupStack::PopAndDestroy( path );
                }
            criteria->SetTObjectValueL<TMPXItemId>(
                KMPXMediaGeneralId,
                media.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) );

            CMPXMedia* songInfo = iCollectionUtility->Collection().FindAllL( *criteria,
                                                             attrs.Array() );
            CleanupStack::PopAndDestroy( &attrs );
            CleanupStack::PushL( songInfo );

            const CMPXMediaArray* mediaArray(
                songInfo->Value<CMPXMediaArray>( KMPXMediaArrayContents ) );
            User::LeaveIfNull(const_cast<CMPXMediaArray*>(mediaArray));

            if ( mediaArray->Count() > 0 )
                {
                CMPXMedia* si( mediaArray->AtL( 0 ) );
                if ( si->IsSupported( KMPXMediaDrmProtected ) )
                    {
                    if ( si->ValueTObjectL<TBool>( KMPXMediaDrmProtected ) &&
                        si->IsSupported( KMPXMediaDrmCanSetAutomated ) )
                        {
                        // if it's drm protected, check if
                        // KMPXMediaDrmCanSetAutomated
                        isHidden = !( si->ValueTObjectL<TBool>( KMPXMediaDrmCanSetAutomated ) );
                        }
                    }
                }
            CleanupStack::PopAndDestroy( songInfo );
            CleanupStack::PopAndDestroy( criteria );
            }
        }
    return isHidden;
    }

// -----------------------------------------------------------------------------
// Checks if file details option should be shown
// -----------------------------------------------------------------------------
//
TBool CMPXCollectionViewHgImp::FileDetailsOptionVisibilityL()
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::FileDetailsOptionVisibilityL" );
    TInt selectionCount( 0 );
    if ( iSelectionIndexCache)
        {
        selectionCount = iSelectionIndexCache->Count();
        }
    TBool isHidden( iContainer->TotalListItemCount() < 1 ||
            selectionCount );
    if ( !isHidden )
        {
        CMPXCollectionViewListBoxArray* array =
            static_cast<CMPXCollectionViewListBoxArray*>(
            iContainer->ListBoxArray() );
        const CMPXMedia& media = array->MediaL(
            iContainer->CurrentLbxItemIndex() );

        if ( media.IsSupported( KMPXMediaGeneralFlags ) )
            {
            TUint flags( media.ValueTObjectL<TUint>( KMPXMediaGeneralFlags ) );
            if ( ( flags ) & ( KMPXMediaGeneralFlagsIsMissingDetails ) )
                {
                isHidden = ETrue;
                }
            }
        }
    return isHidden;
    }



// -----------------------------------------------------------------------------
// Handle send command in TBone view.
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::DoSendTBoneListItemL(TMPXItemId aContainerId)
    {

    MPX_FUNC( "CMPXCollectionViewHgImp::DoSendTBoneListItemL" );
    
    CMPXCollectionPath* path( iCollectionUtility->Collection().PathL() );
    CleanupStack::PushL( path );
    
    CMPXMedia* albumTrack = iContainer->SelectedItemMediaL();
    TMPXItemId trackId = albumTrack->ValueTObjectL<TMPXItemId>(KMPXMediaGeneralId);

    path->Back();
    path->Back();
    path->AppendL(aContainerId);
    path->AppendL(trackId); 

    RArray<TMPXAttribute> attrs;
    CleanupClosePushL(attrs);
    attrs.Append(
        TMPXAttribute( KMPXMediaIdGeneral,
            EMPXMediaGeneralUri | EMPXMediaGeneralSize |
            EMPXMediaGeneralCollectionId |
            EMPXMediaGeneralFlags | EMPXMediaGeneralId |
            EMPXMediaGeneralType | EMPXMediaGeneralCategory ) );
    iCurrentMediaLOp = EMPXOpMediaLSend;
    iCollectionUtility->Collection().MediaL( *path, attrs.Array() );
    CleanupStack::PopAndDestroy( &attrs );
    CleanupStack::PopAndDestroy( path );
}




// -----------------------------------------------------------------------------
// Handle send command.
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::DoSendL()
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::DoSendL" );


    CMPXCommonListBoxArrayBase* listboxArray(
        iContainer->ListBoxArray() );
    TInt currentIndex( iContainer->CurrentLbxItemIndex() );
    const CMPXMedia& media( listboxArray->MediaL(
        iContainer->CurrentLbxItemIndex() ) );

    // Marked indicies
    TInt arrayCount( iSelectionIndexCache->Count() );

    if ( ( arrayCount == 0 || arrayCount == 1 ) &&
        ( media.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) == KMPXInvalidItemId ) )
        {
        // not marked, or only 1 item is marked
        // and the highlighted item is not yet available
        MPX_DEBUG1( "CMPXCollectionViewHgImp::DoSendL item not yet fetched" );
        }
    else
        {
        CMPXCollectionPath* path = iCollectionUtility->Collection().PathL();
        CleanupStack::PushL( path );

        MPX_DEBUG2( "CMPXCollectionViewHgImp::DoSendL array count = %d", arrayCount );
        if ( arrayCount > 1 )
            {
            // if more than 1 selected
            for ( TInt i = 0; i < arrayCount; i++ )
                {
                MPX_DEBUG2( "CMPXCollectionViewHgImp::DoSendL array index = %d", iSelectionIndexCache->At( i ) );
                path->SelectL( iSelectionIndexCache->At(i) );
                }
            }
        else
            {
            // if only 1 item is marked, treat it as single selection
            path->Set( ( arrayCount == 1 ) ?
                iSelectionIndexCache->At( 0 ) : iContainer->CurrentLbxItemIndex() );
            }

        RArray<TMPXAttribute> attrs;
        CleanupClosePushL(attrs);
        attrs.Append(
            TMPXAttribute( KMPXMediaIdGeneral,
                EMPXMediaGeneralUri | EMPXMediaGeneralSize |
                EMPXMediaGeneralCollectionId |
                EMPXMediaGeneralFlags | EMPXMediaGeneralId |
                EMPXMediaGeneralType | EMPXMediaGeneralCategory ) );
        iCurrentMediaLOp = EMPXOpMediaLSend;
        iCollectionUtility->Collection().MediaL( *path, attrs.Array() );
        CleanupStack::PopAndDestroy( &attrs );
        CleanupStack::PopAndDestroy( path );
        }
    }

// -----------------------------------------------------------------------------
// Handle send playlist command
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::DoSendPlaylistL( TMPXItemId aItemId )
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::DoSendPlaylistL" );
    // export the playlist to file system, and send the playlist
    // when the operation is completed
    HBufC* defaultDrive = iCommonUiHelper->DefaultDriveLC();
    TFileName defaultPath;
    defaultPath.Append( *defaultDrive );
    RFs& fileSession = iCoeEnv->FsSession();
    TBool folderExist = BaflUtils::FolderExists( fileSession, defaultPath );
    TInt count( 0 );
    // use time stamp as the directory name for export, so that
    // it won't overwrite any existing files.  It will search for the first
    // available folder that is not currently in the file system
    while ( folderExist )
        {
        if ( count++ > KMPXPlaylistExportRetry )
            {
            MPX_DEBUG1( "CMPXCollectionViewHgImp::DoSendPlaylistL maximum retry count reached, leaving" );
            User::Leave( KErrNotReady );
            }
        defaultPath.Copy( *defaultDrive );
        TTime timeStamp;
        timeStamp.UniversalTime();
        defaultPath.AppendNum( timeStamp.Int64() );
        defaultPath.Append( KPathDelimiter );
        folderExist = BaflUtils::FolderExists( fileSession, defaultPath );
        }
    CleanupStack::PopAndDestroy( defaultDrive );
    MPX_DEBUG2( "CMPXCollectionViewHgImp::DoSendPlaylistL creating path = %S", &defaultPath );
    BaflUtils::EnsurePathExistsL( fileSession, defaultPath );
    // playlist is sent in the call back of this function
    iCollectionUiHelper->ExportPlaylistL( aItemId, defaultPath, this );
    }

// -----------------------------------------------------------------------------
// Handle call back from collectionframework for send command
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::DoHandleSendL( const CMPXMedia& aMedia )
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::DoHandleSendL" );
    TInt invalidFileCount( 0 );
    TInt maxSize( 0 );
    CMessageData* messageData = CMessageData::NewLC();

    TInt fileCount( 0 );
    if( aMedia.IsSupported( KMPXMediaArrayContents ) )
        {
        const CMPXMediaArray* mediaArray =
            aMedia.Value<CMPXMediaArray>( KMPXMediaArrayContents );
        User::LeaveIfNull(const_cast<CMPXMediaArray*>(mediaArray));
        fileCount = mediaArray->Count();

        }
    MPX_DEBUG2( "CMPXCollectionViewHgImp::DoHandleSendL Entry count = %d", fileCount );

    if ( fileCount > 0 )
        {
        const CMPXMediaArray* mediaArray =
            aMedia.Value<CMPXMediaArray>( KMPXMediaArrayContents );
        User::LeaveIfNull(const_cast<CMPXMediaArray*>(mediaArray));

        CMPXMedia* media( NULL );
        for ( TInt i = 0; i < fileCount; i++ )
            {
            media = mediaArray->AtL( i );
            TUint flags( media->ValueTObjectL<TUint>( KMPXMediaGeneralFlags ) );
            const TDesC& location = media->ValueText( KMPXMediaGeneralUri );

            if ( !( flags & KMPXMediaGeneralFlagsIsInvalid ) &&
                ConeUtils::FileExists( location ) )
                {
                TInt fileSize( 0 );
                if ( media->IsSupported( KMPXMediaGeneralSize ) )
                    {
                    fileSize = media->ValueTObjectL<TInt>( KMPXMediaGeneralSize );
                    }
                else
                    {
                    RFs& fileSession = iCoeEnv->FsSession();
                    TEntry pl;
                    fileSession.Entry( location, pl );
                    fileSize = pl.iSize;
                    }
                if ( fileSize > maxSize )
                    {
                    maxSize = fileSize;
                    }
                messageData->AppendAttachmentL( location );
                }
            else
                {
                UpdateDatabaseFlagL( KErrNotFound, *media,
                    KMPXMediaGeneralFlagsIsInvalid, ETrue, EFalse );
                invalidFileCount++;
                }
            }
        }
    else
        {
        // single file
        fileCount = 1;
        TUint flags = aMedia.ValueTObjectL<TUint>( KMPXMediaGeneralFlags );
        const TDesC& location = aMedia.ValueText( KMPXMediaGeneralUri );

        if ( !( flags & KMPXMediaGeneralFlagsIsInvalid ) &&
            ConeUtils::FileExists( location ) )
            {
            TInt fileSize( 0 );
            if ( aMedia.IsSupported( KMPXMediaGeneralSize ) )
                {
                fileSize = aMedia.ValueTObjectL<TInt>( KMPXMediaGeneralSize );
                }
            else
                {
                RFs& fileSession = iCoeEnv->FsSession();
                TEntry pl;
                fileSession.Entry( location, pl );
                fileSize = pl.iSize;
                }
            if ( fileSize > maxSize )
                {
                maxSize = fileSize;
                }
            messageData->AppendAttachmentL( location );
            }
        else
            {
            UpdateDatabaseFlagL( KErrNotFound, aMedia,
                KMPXMediaGeneralFlagsIsInvalid, ETrue, EFalse );
            invalidFileCount++;
            }
        }
    TBool confirmOk( EFalse );
    MPX_DEBUG3( "CMPXCollectionViewHgImp::DoHandleSendL Invalid Count = %d, Total Count = %d", invalidFileCount, fileCount );
    if ( invalidFileCount )
        {
        if ( invalidFileCount == fileCount )
            {
            // all files are invalid
            iCommonUiHelper->DisplayInfoNoteL( ( invalidFileCount == 1 ) ?
                R_MPX_COLLECTION_INFO_FILE_NOT_FOUND :
                R_MPX_COLLECTION_SEND_ALL_INVALID_SONGS_NOTE_TXT );
            }
        else
            {
            // Show confirmation query if invalid file found
            HBufC* queryTxt = StringLoader::LoadLC(
                R_MPX_COLLECTION_QUERY_SEND_INVALID_SONGS_TXT );
            CAknQueryDialog* query = CAknQueryDialog::NewL(
                CAknQueryDialog::EConfirmationTone );
            CleanupStack::PushL( query );
            query->PublishDialogL( EMPlayerNoteSendInvalidSongs,
                                KMPlayerNoteCategory);
            CleanupStack::Pop( query );
            confirmOk = query->ExecuteLD(
                R_MPX_COLLECTION_GENERIC_CONFIRMATION_QUERY,
                *queryTxt );
            CleanupStack::PopAndDestroy( queryTxt );
            }
        }

    if ( !invalidFileCount || confirmOk )
        {
        if ( !iSendUi )
            {
            iSendUi = CSendUi::NewL();
            }
        TSendingCapabilities capabilities(
            0,
            maxSize,
            TSendingCapabilities::ESupportsAttachments );
        // ignore commands from external clients so that the
        // sending is not interrupted
        HandleCommandL( EMPXCmdIgnoreExternalCommand );
        // send ui leaves with error 0 if canceled, have to be trapped
        MPX_TRAPD( err, iSendUi->ShowQueryAndSendL( messageData, capabilities ) );
        if ( err != KErrNone )
            {
            HandleError( err );
            }
        HandleCommandL( EMPXCmdHandleExternalCommand );
        }

    // Clear selection
    iContainer->ClearLbxSelection();
    CleanupStack::PopAndDestroy( messageData );
    }

// -----------------------------------------------------------------------------
// Handle rename command
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::DoHandleRenameL()
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::DoHandleRenameL" );
    CMPXCommonListBoxArrayBase* listboxArray(
        iContainer->ListBoxArray() );
    TInt currentIndex( iContainer->CurrentLbxItemIndex() );
    const CMPXMedia& currentMedia( listboxArray->MediaL( currentIndex ) );
    TMPXGeneralCategory category(
        currentMedia.ValueTObjectL<TMPXGeneralCategory>( KMPXMediaGeneralCategory ) );
    switch ( category )
        {
        case EMPXPlaylist:
            {
            // rename playlist
            iCurrentMediaLOp = EMPXOpMediaLRenamePlaylist;
            CMPXCollectionPath* path = iCollectionUtility->Collection().PathL();
            CleanupStack::PushL( path );
            path->Set( iContainer->CurrentLbxItemIndex() );
            RArray<TMPXAttribute> attrs;
            CleanupClosePushL(attrs);
            attrs.Append(
                TMPXAttribute( KMPXMediaIdGeneral,
                    EMPXMediaGeneralUri | EMPXMediaGeneralId |
                    EMPXMediaGeneralTitle ) );
            iCollectionUtility->Collection().MediaL( *path, attrs.Array() );
            CleanupStack::PopAndDestroy( &attrs );
            CleanupStack::PopAndDestroy( path );
            break;
            }
        case EMPXAlbum:
        case EMPXArtist:
        case EMPXGenre:
        case EMPXComposer:
            {
            delete iNewName;
            iNewName = NULL;
            iNewName = HBufC::NewL( KMaxFileName );
            TPtr ptr( iNewName->Des() );

            // Set default text as current selected item text
            const CMPXMediaArray& mediaAry = listboxArray->MediaArray();
            CMPXMedia* origMedia( mediaAry.AtL( currentIndex ) );
            const TDesC& title = origMedia->ValueText( KMPXMediaGeneralTitle );
            ptr.Append( title.Left(KMaxFileName) );

            CAknTextQueryDialog* query = CAknTextQueryDialog::NewL( ptr );
            CleanupStack::PushL( query );
            query->SetMaxLength( KMaxFileName );
            HBufC* promptTxt = StringLoader::LoadLC( R_MPX_QTN_NMP_PRMPT_NEW_NAME );
            query->SetPromptL( *promptTxt );
            query->SetPredictiveTextInputPermitted( ETrue );
            CleanupStack::PopAndDestroy( promptTxt );
            query->PublishDialogL(
                    EMPlayerQueryPrmptNewName,
                    KMPlayerNoteCategory);
            CleanupStack::Pop( query );
            if ( query->ExecuteLD( R_MPX_CUI_RENAME_QUERY ) )
                {
                TMPXItemId id(
                    currentMedia.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) );

                CMPXMedia* media = CMPXMedia::NewL();
                CleanupStack::PushL( media );
                media->SetTObjectValueL<TMPXGeneralType>(
                    KMPXMediaGeneralType, EMPXGroup );
                media->SetTObjectValueL<TMPXGeneralCategory>(
                    KMPXMediaGeneralCategory, EMPXSong );
                media->SetTObjectValueL<TMPXItemId>( KMPXMediaGeneralId, id );

                switch ( category )
                    {
                    case EMPXAlbum:
                        {
                        iCurrentFindAllLOp = EMPXOpFindAllLRenameAlbum;
                        // check if it's album or artist/album
                        const CMPXMedia& containerMedia = listboxArray->ContainerMedia();
                        TMPXGeneralCategory containerCategory(
                            containerMedia.ValueTObjectL<TMPXGeneralCategory>(
                             KMPXMediaGeneralCategory ) );
                        if ( containerCategory == EMPXArtist )
                            {
                            // artist/album level, need to specify artist ID in container ID
                            TMPXItemId containerId(
                                containerMedia.ValueTObjectL<TMPXItemId>(
                                    KMPXMediaGeneralId ) );
                            media->SetTObjectValueL<TMPXItemId>(
                                KMPXMediaGeneralContainerId, containerId );
                            }
                        break;
                        }
                    case EMPXArtist:
                        {
                        iCurrentFindAllLOp = EMPXOpFindAllLRenameArtist;
                        break;
                        }
                    case EMPXGenre:
                        {
                        iCurrentFindAllLOp = EMPXOpFindAllLRenameGenre;
                        break;
                        }
                    case EMPXComposer:
                        {
                        iCurrentFindAllLOp = EMPXOpFindAllLRenameComposer;
                        break;
                        }
                    default:
                        {
                        ASSERT( 0 );
                        break;
                        }
                    }
                RArray<TMPXAttribute> attrs;
                CleanupClosePushL( attrs );
                attrs.Append(
                    TMPXAttribute( KMPXMediaIdGeneral,
                        EMPXMediaGeneralId | EMPXMediaGeneralUri |
                        EMPXMediaGeneralCollectionId |
                        EMPXMediaGeneralType | EMPXMediaGeneralCategory | EMPXMediaGeneralFlags ) );
                if ( category == EMPXAlbum || category == EMPXArtist )
                    {
                    attrs.Append( TMPXAttribute( KMPXMediaIdMusic,
                        EMPXMediaMusicAlbumArtFileName ) );
                    }
                iCollectionUtility->Collection().FindAllL( *media, attrs.Array(), *this );
                CleanupStack::PopAndDestroy( &attrs );
                CleanupStack::PopAndDestroy( media );
                }
            break;
            }
        default:
            {
            // shouldn't reach here
            ASSERT( 0 );
            break;
            }
        }
    }

// -----------------------------------------------------------------------------
// Prepares media object for selected items
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::PrepareMediaForSelectedItemsL( CMPXMedia& aMedia, TMPXGeneralCategory aContainerCategory, TMPXGeneralType aContainerType  )
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::PrepareMediaForSelectedItemsL" );
    CMPXMediaArray* mediaArray( CMPXMediaArray::NewL() );
    CleanupStack::PushL( mediaArray );

    CMPXCollectionPath* path( iCollectionUtility->Collection().PathL() );
    CleanupStack::PushL( path );
    TMPXItemId id( path->Id( 0 ) );
    MPX_DEBUG2( "CMPXCollectionViewHgImp::PrepareMediaForSelectedItemsL collection ID = 0x%x", id.iId1 );
    CleanupStack::PopAndDestroy( path );
    
    //support for TBone view add to playlist
    if ( aContainerCategory == EMPXAlbum && aContainerType == EMPXItem)
        { 	 
        CMPXMedia* media = iContainer->SelectedItemMediaL();
        if ( media->ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) == KMPXInvalidItemId )
           {
           // leave with special error code, this error
           // should not trigger any error message, the operation should
           // be terminated silently
           User::Leave( KMPXErrDataNotReady );
           }
        else
           {
           CMPXMedia* entry( PopulateMediaLC( *media, id ) );
           mediaArray->AppendL( entry );
           CleanupStack::Pop( entry );
           }      	
       }

    else
        {
        TInt count( iSelectionIndexCache->Count() );   
        CMPXCommonListBoxArrayBase* listBoxArray =   
            iContainer->ListBoxArray(); 
        if ( count > 0 )
            {
                            
            if ( count == 1 )
                {
                // marked one item, if it's not valid, ignore the command
                const CMPXMedia& listBoxMedia = listBoxArray->MediaL( iSelectionIndexCache->At(0) );
                if ( listBoxMedia.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) == KMPXInvalidItemId )
                    {
                    // leave with special error code, this error
                    // should not trigger any error message, the operation should
                    // be terminated silently
                    User::Leave( KMPXErrDataNotReady );
                    }
                
                }
                for ( TInt i = 0; i < count; i++ )
                    {
                    const CMPXMedia& listBoxMedia = listBoxArray->MediaL( iSelectionIndexCache->At(i) );
                    if ( listBoxMedia.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) == KMPXInvalidItemId )
                        {
                        // item not ready, cache this command and execute
                        // it when the data becomes valid
                        User::Leave( KMPXErrDataNotReadyCacheCommand );
                        }
                    CMPXMedia* entry( PopulateMediaLC( listBoxMedia, id ) );
                    mediaArray->AppendL( entry );
                    CleanupStack::Pop( entry );
                    }
            }
       
        else
            {
            const CMPXMedia& listBoxMedia = listBoxArray->MediaL(
                iContainer->CurrentLbxItemIndex() );
            if ( listBoxMedia.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) == KMPXInvalidItemId )
                {
                // leave with special error code, this error
                // should not trigger any error message, the operation should
                // be terminated silently
                User::Leave( KMPXErrDataNotReady );
                }
            else
                {
                CMPXMedia* entry( PopulateMediaLC( listBoxMedia, id ) );
                mediaArray->AppendL( entry );
                CleanupStack::Pop( entry );
                }
            }
       }
 
       aMedia.SetTObjectValueL( KMPXMediaGeneralCollectionId, id );
       aMedia.SetCObjectValueL( KMPXMediaArrayContents, mediaArray );
       aMedia.SetTObjectValueL( KMPXMediaArrayCount, mediaArray->Count() );
       iNumSongAddedToPlaylist = mediaArray->Count();
       CleanupStack::PopAndDestroy( mediaArray );
    }

// -----------------------------------------------------------------------------
// Populates media object with information needed for save to
// existing playlist
// -----------------------------------------------------------------------------
//
CMPXMedia* CMPXCollectionViewHgImp::PopulateMediaLC(
    const CMPXMedia& aMedia, TMPXItemId aCollectionId )
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::PopulateMediaLC" );
    CMPXMedia* entry = CMPXMedia::NewL();
    CleanupStack::PushL( entry );
    entry->SetTextValueL(
        KMPXMediaGeneralTitle,
        aMedia.ValueText( KMPXMediaGeneralTitle ) );
    entry->SetTObjectValueL( KMPXMediaGeneralType, EMPXItem);
    entry->SetTObjectValueL( KMPXMediaGeneralCategory, EMPXSong );
    entry->SetTObjectValueL( KMPXMediaGeneralId,
        aMedia.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) );
    entry->SetTObjectValueL( KMPXMediaGeneralCollectionId, aCollectionId );
    return entry;
    }

// -----------------------------------------------------------------------------
// Handle rename playlist command
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::DoHandleRenamePlaylistL( const CMPXMedia& aMedia )
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::DoHandleRenamePlaylistL" );
    const TDesC& uri = aMedia.ValueText( KMPXMediaGeneralUri );
    TParsePtrC fn( uri );
#ifdef _DEBUG
    TPtrC ptr( fn.NameAndExt() );
    MPX_DEBUG2( "CMPXCollectionViewHgImp::DoHandleRenamePlaylistL Original Uri = %S", &ptr );
#endif
    HBufC* playlistName = HBufC::NewLC( KMaxFileName );
    TPtr playlistNamePtr = playlistName->Des();
    const TDesC& title = aMedia.ValueText( KMPXMediaGeneralTitle );
    TInt ret = iCommonUiHelper->LaunchRenameDialogL(
        title, playlistNamePtr, fn.DriveAndPath() );
    if ( ret )
        {
        CMPXMedia* media = CMPXMedia::NewL();
        CleanupStack::PushL( media );
        media->SetTObjectValueL<TMPXGeneralType>(
            KMPXMediaGeneralType, EMPXItem );
        media->SetTObjectValueL<TMPXGeneralCategory>(
            KMPXMediaGeneralCategory, EMPXPlaylist );
        TMPXItemId id( aMedia.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) );
        media->SetTObjectValueL<TMPXItemId>( KMPXMediaGeneralId, id );
        TParsePtrC newFn( *playlistName );
        media->SetTextValueL( KMPXMediaGeneralTitle, newFn.NameAndExt() );
        iCollectionUiHelper->RenameL( *media, this );
        CleanupStack::PopAndDestroy( media );
        }
    CleanupStack::PopAndDestroy( playlistName );
    }

// ---------------------------------------------------------------------------
// Set/clears the flags for item in database
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::UpdateDatabaseFlagL(
    TInt aIndex, const CMPXMedia& aMedia, TUint aFlag,
    TBool aSet, TBool aEnableInfoDialog )
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::UpdateDatabaseFlagL" );
    MPX_DEBUG3( "CMPXCollectionViewHgImp::UpdateDatabaseFlagL aFlag = 0x%x, aSet = %d", aFlag, aSet );
    CMPXCommonListBoxArrayBase* array( iContainer->ListBoxArray() );
    ASSERT( array );

    // set the item as invalid
    TUint flags( 0 );
    if ( aSet )
        {
        flags = KMPXMediaGeneralFlagsSetOrUnsetBit;
        }
    flags |= aFlag;

    MPX_DEBUG2( "CMPXCollectionViewHgImp::UpdateDatabaseFlagL flag after 0x%x", flags );
    CMPXMedia* entry = CMPXMedia::NewL();
    CleanupStack::PushL( entry );
    if ( aIndex > KErrNotFound )
        {
        MPX_DEBUG2( "CMPXCollectionViewHgImp::UpdateDatabaseFlagL using aIndex = %d", aIndex );
        const CMPXMedia& media = array->MediaL( aIndex );
        TMPXItemId id( media.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) );
        TMPXGeneralType type(
            media.ValueTObjectL<TMPXGeneralType>( KMPXMediaGeneralType ) );
        TMPXGeneralCategory category(
            media.ValueTObjectL<TMPXGeneralCategory>( KMPXMediaGeneralCategory ) );
        entry->SetTObjectValueL<TMPXItemId>( KMPXMediaGeneralId, id );
        entry->SetTObjectValueL<TMPXGeneralType>(
            KMPXMediaGeneralType, type );
        entry->SetTObjectValueL<TMPXGeneralCategory>(
            KMPXMediaGeneralCategory, category );
        }
    else
        {
        // try to look for the info inside aMedia
        if ( aMedia.IsSupported( KMPXMediaGeneralId ) )
            {
            TMPXItemId id( aMedia.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) );
            entry->SetTObjectValueL<TMPXItemId>( KMPXMediaGeneralId, id );
            }
        if ( aMedia.IsSupported( KMPXMediaGeneralType ) )
            {
            TMPXGeneralType type(
                aMedia.ValueTObjectL<TMPXGeneralType>( KMPXMediaGeneralType ) );
            entry->SetTObjectValueL<TMPXGeneralType>(
                KMPXMediaGeneralType, type );
            }
        if ( aMedia.IsSupported( KMPXMediaGeneralCategory ) )
            {
            TMPXGeneralCategory category(
                aMedia.ValueTObjectL<TMPXGeneralCategory>(
                    KMPXMediaGeneralCategory ) );
            entry->SetTObjectValueL<TMPXGeneralCategory>(
                KMPXMediaGeneralCategory, category );
            }
        }
    TUid collectionId( aMedia.ValueTObjectL<TUid>( KMPXMediaGeneralCollectionId ) );
    entry->SetTObjectValueL<TUid>(
        KMPXMediaGeneralCollectionId, collectionId );
    entry->SetTObjectValueL<TUint>( KMPXMediaGeneralFlags, flags );

    // Update the collection via CommandL
    CMPXCommand* cmd( CMPXCommand::NewL() );
    CleanupStack::PushL( cmd );
    cmd->SetTObjectValueL( KMPXCommandGeneralId, KMPXCommandIdCollectionSet );
    cmd->SetTObjectValueL( KMPXCommandGeneralDoSync, ETrue );
    TUid colId( entry->ValueTObjectL<TUid>(KMPXMediaGeneralCollectionId) );
    cmd->SetTObjectValueL( KMPXCommandGeneralCollectionId, colId.iUid );
    cmd->SetCObjectValueL<CMPXMedia>( KMPXCommandColSetMedia, entry );
    iCollectionUtility->Collection().CommandL( *cmd );
    CleanupStack::PopAndDestroy( cmd );

    CleanupStack::PopAndDestroy( entry );
    if ( aEnableInfoDialog && KMPXMediaGeneralFlagsIsInvalid == aFlag )
        {
        iCommonUiHelper->DisplayInfoNoteL( R_MPX_COLLECTION_INFO_FILE_NOT_FOUND );
        }
    }

// ---------------------------------------------------------------------------
// Get duration of current view
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::GetDurationL()
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::GetDurationL" );
    CMPXCollectionPath* cpath = iCollectionUtility->Collection().PathL();
    CleanupStack::PushL( cpath );
    cpath->Back();  // Container
    RArray<TMPXAttribute> attrs;
    CleanupClosePushL(attrs);
    iCurrentMediaLOp = EMPXOpMediaLGetContainerInfo;
    attrs.Append( KMPXMediaGeneralDuration );
    iCollectionUtility->Collection().MediaL( *cpath, attrs.Array() );
    CleanupStack::PopAndDestroy( &attrs );
    CleanupStack::PopAndDestroy( cpath );
    }

// ---------------------------------------------------------------------------
// Handles file check result
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::DoHandleFileCheckResultL(
    TUid aViewToActivate, const CMPXMedia& aMedia )
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::HandleFileCheckResultL" );
    const TDesC& location = aMedia.ValueText( KMPXMediaGeneralUri );
    if ( location.Length() == 0 || ConeUtils::FileExists( location ) )
        {
        HandleListBoxEventL( NULL, EEventItemClicked );   
        HBufC* buf = HBufC::NewLC( 5 ); // magic number, array granularity
        buf->Des().AppendNum( iContainer->CurrentLbxItemIndex() );
        // Activate view via View Framework
        iViewUtility->ActivateViewL( aViewToActivate, buf );
        CleanupStack::PopAndDestroy( buf );
        }
    else
        {
        // mark database entry for this item as invalid
        UpdateDatabaseFlagL( iContainer->CurrentLbxItemIndex(),
            aMedia, KMPXMediaGeneralFlagsIsInvalid, ETrue );
        }
    }

#ifdef __ENABLE_MSK
// ---------------------------------------------------------------------------
// Updates the middle softkey display
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::UpdateMiddleSoftKeyDisplayL( TInt aMskId )
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::UpdateMiddleSoftKeyDisplayL" );
    CEikButtonGroupContainer* cba = Cba();
    if ( cba )
        {
        if ( !iContainer->CurrentListItemCount() ) // list is empty
            {
            // remove middle softkey label
            iCommonUiHelper->RemoveMiddleSoftKeyLabel( *cba );
            MPX_DEBUG1( "CMPXCollectionViewHgImp::UpdateMiddleSoftKeyDisplayL - remove label, list is empty" );
            }
        else if ( iContainer->CurrentSelectionIndicesL()->Count() ) // marked items
            {
            CFbsBitmap* bitmap = NULL;
            CFbsBitmap* mask = NULL;
            AknsUtils::CreateColorIconL(
                AknsUtils::SkinInstance(),
                KAknsIIDQgnPropMskMenu,
                KAknsIIDQsnComponentColors,
                EAknsCIQsnComponentColorsCG13,
                bitmap,
                mask,
                AknIconUtils::AvkonIconFileName(),
                EMbmAvkonQgn_prop_msk_menu,
                EMbmAvkonQgn_prop_msk_menu_mask,
                KRgbBlack);

            CleanupStack::PushL(bitmap);
            CleanupStack::PushL(mask);

            // set middle softkey icon
            iCommonUiHelper->SetMiddleSoftKeyIconL(*cba, bitmap, mask);

            CleanupStack::PopAndDestroy(2, bitmap);
            MPX_DEBUG1("CMPXCollectionViewHgImp::UpdateMiddleSoftKeyDisplayL - items marked, show icon");
            }
        else
            {
            // set middle softkey label
            iCommonUiHelper->SetMiddleSoftKeyLabelL(
                *cba,
                aMskId,
                EAknSoftkeyForwardKeyEvent );
            iCurrentMskId = aMskId;
            MPX_DEBUG1( "CMPXCollectionViewHgImp::UpdateMiddleSoftKeyDisplayL - label displayed" );
            }
        cba->DrawDeferred();
        }
    }
#endif // __ENABLE_MSK


// ---------------------------------------------------------------------------
// Handles the completion of adding a playlist event
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::HandleAddCompletedL(
    CMPXMedia* aPlaylist, TInt aError )
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::HandleAddCompletedL" );
    iAddingToNewPlaylist = EFalse;
    iCommonUiHelper->DismissWaitNoteL();
    HandleCommandL( EMPXCmdHandleExternalCommand );
    if ( aError == KErrNone )
        {
        // Show confirmation note
        if( aPlaylist->IsSupported( KMPXMediaGeneralId ) )
            {
            iPlaylistId = aPlaylist->ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId );
            }
        MPX_DEBUG2( "CMPXCollectionViewHgImp::HandleAddCompletedL iPlaylistId = 0x%x", iPlaylistId.iId1 );
        if ( iCurrentPlaylistOp != EMPXOpPLCreating )
            {
            HBufC* confirmTxt( NULL );
            const TDesC& title( aPlaylist->ValueText( KMPXMediaGeneralTitle ) );
            TMPlayerSecondaryDisplayNote noteId( EMPlayerNoteNone );
            if ( iNumSongAddedToPlaylist > 1 )
                {
                confirmTxt = StringLoader::LoadLC(
                    R_MPX_QTN_MUS_MULTIPLE_TRACKS_ADDED_TO_PL,
                    title, iNumSongAddedToPlaylist );
                noteId = EMPlayerNoteAddManySongToPlaylist;
                }
            else
                {
                confirmTxt = StringLoader::LoadLC(
                    R_MPX_QTN_MUS_NOTE_TRACK_ADDED_TO_PL, title );
                noteId = EMPlayerNoteAddSongToPlaylist;
                }

            CAknConfirmationNote* note = new ( ELeave ) CAknConfirmationNote();

            note->PublishDialogL(
                noteId,
                KMPlayerNoteCategory );

            if ( iCoverDisplay )
                {
                CAknMediatorFacade* covercl = AknMediatorFacade( note );
                if ( covercl )
                    {
                    covercl->BufStream() << title;
                    if ( iNumSongAddedToPlaylist > 1 )
                        {
                        covercl->BufStream().WriteInt32L( iNumSongAddedToPlaylist );
                        }
                    }
                }

            note->ExecuteLD( *confirmTxt );
            CleanupStack::PopAndDestroy( confirmTxt );

            }
        else // iCurrentPlaylistOp == EMPXOpPLCreating
            {
            // Re-open the collection, because we cannot
            // depend on the change events that could be a race condition
            // against this HandleAddCompleteL() callback!
            //
            DoIncrementalOpenL();
            }
        }
    else
        {
        HandleError( aError );
        }

    delete aPlaylist;
    if ( iContainer )
        {
        iContainer->ClearLbxSelection();
        }
    }

// -----------------------------------------------------------------------------
// Handles the completion of setting a media event.
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::HandleSetCompletedL( CMPXMedia* aMedia, TInt aError )
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::HandleSetCompletedL" );
    delete aMedia;
    if ( aError == KErrNone )
        {
        // save successful, set flag so that it can't be saved again
        MPXTlsHelper::SetNeedSave( EFalse );
        }
    else
        {
        if (iContainer->IsInReorderMode())
            {
            DeactivateReorderGrabbedModeL(ETrue);
            }
        HandleError( aError );
        }
    if ( iIsSavingReorderPlaylist )
        {
        // change messages are ignored during save command,
        // when save is complete, it should open the collection again to refresh
        // display data
        DoIncrementalOpenL();
        iIsSavingReorderPlaylist = EFalse;
        }
    }

// -----------------------------------------------------------------------------
// Handle playback message
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::DoHandlePlaybackMessageL( const CMPXMessage& aMessage )
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::DoHandlePlaybackMessageL" );
    TMPXMessageId id( aMessage.ValueTObjectL<TMPXMessageId>( KMPXMessageGeneralId ) );
    if ( KMPXMessageGeneral == id )
        {
        TInt type( aMessage.ValueTObjectL<TInt>( KMPXMessageGeneralType ) );
        TInt data( aMessage.ValueTObjectL<TInt>( KMPXMessageGeneralData ) );
        TInt event( aMessage.ValueTObjectL<TInt>( KMPXMessageGeneralEvent ) );
        switch ( event )
            {
            case TMPXPlaybackMessage::EActivePlayerChanged:
            case TMPXPlaybackMessage::EStateChanged:
                {
                MPX_DEBUG2( "CMPXCollectionViewHgImp::HandlePlaybackMessageL - EStateChanged(%d)", type );
                UpdatePlaybackStatusL();
                break;
                }
            case TMPXPlaybackMessage::EError:
                {
                if ( iCommonUiHelper )
                    {
                    iCommonUiHelper->DismissWaitNoteL();
                    HandleCommandL( EMPXCmdHandleExternalCommand );
                    }
                if ( iIsDeleting )
                    {
                    iCollectionUiHelper->Cancel();
                    iIsDeleting = EFalse;
                    // if delete is interrupted, reopen
                    DoIncrementalOpenL();
                    }
                MPX_DEBUG2( "CMPXCollectionViewHgImp::HandlePlaybackMessageL Error = %d", data );
                break;
                }
            case TMPXPlaybackMessage::EPlayerUnavailable:
                {
                if ( iUpnpFrameworkSupport )
                    {
                    if ( data == KErrNotFound )
                        {
                        if ( iViewUtility->ActiveViewType() ==
                            TUid::Uid( KMPXPluginTypeCollectionUid ) )
                            {
                            if ( iSubPlayerName )
                                {
                                HBufC* dialogText = StringLoader::LoadLC( R_MPX_COLLECTION_NOTE_REMOTE_CONNECTION_FAILED,
                                                                          *iSubPlayerName );
                                CAknErrorNote* errNote = new(ELeave) CAknErrorNote(ETrue);
                                errNote->SetTimeout(CAknNoteDialog::ELongTimeout);
                                errNote->ExecuteLD( *dialogText );
                                CleanupStack::PopAndDestroy( dialogText );
                                }
                            }
                        }
                    }
                // else we don't show any error note
                break;
                }
            default:
                {
                // ignore other messages
                break;
                }
            }
        // Fix EBLI-7CFE4D press select key very quick cause System Error KErrArgument
        if (event != TMPXPlaybackMessage::ECommandReceived)
            {
            iHandlingKeyEvent = EFalse;
            }
        }
    else
        {
        iHandlingKeyEvent = EFalse;
        }
    }

// -----------------------------------------------------------------------------
// Handle collection message
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::DoHandleCollectionMessageL( const CMPXMessage& aMessage )
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::DoHandleCollectionMessageL" );
    TMPXMessageId id( aMessage.ValueTObjectL<TMPXMessageId>( KMPXMessageGeneralId ) );
    if ( KMPXMessageGeneral == id )
        {
        TInt event( aMessage.ValueTObjectL<TInt>( KMPXMessageGeneralEvent ) );
        TInt type( aMessage.ValueTObjectL<TInt>( KMPXMessageGeneralType ) );
        TInt data( aMessage.ValueTObjectL<TInt>( KMPXMessageGeneralData ) );
        MPX_DEBUG4( "CMPXCollectionViewHgImp::DoHandleCollectionMessageL Event = %d, Type() = %d, data = %d",
            event, type, data );

        // Only handle collection messages while collection view is in focus
        // and not transitioning views
        if( iContainer )
            {

            if ( event == TMPXCollectionMessage::EPathChanged &&
                 type == EMcPathChangedByOpen &&
                 data == EMcContainerOpened
                 )
                { // Open new entries
                MPX_DEBUG1( "CMPXCollectionViewHgImp::DoHandleCollectionMessageL calling OpenL EMcPathChangedByOpen" );
                if ( iContainer->IsInReorderMode() )
                    {
                    MPX_DEBUG1( "CMPXCollectionViewHgImp::DoHandleCollectionMessageL canceling reorder mode" );
                    // cancel reorder mode if path has changed
                    ProcessCommandL( EMPXCmdReorderDone );
                    }
                if( iContainer->CurrentSelectionIndicesL()->Count() )
                    {
                    HandleCommandL( EAknUnmarkAll );
                    }

                // Incremental Open when browsing to the next level
                DoIncrementalOpenL();
                }
            else if ( event == TMPXCollectionMessage::EPathChanged &&
                      type == EMcPathChangedByCollectionChange )
                {
                // Re-Fetch entries only if we are in playlist
                // creation idle stage. Ignore change messages during playlist op
                // because there are race conditions and we don't know
                // which handle open is actually opening the playlist!
                //
                // don't call openL if it's currently deleting
                // don't call openL if saving after reorder
                // don't call openL if renaming
                if( iCurrentPlaylistOp == EMPXOpPLIdle  && !iIsDeleting
                    && !iIsSavingReorderPlaylist && iSetMediaLCount == KErrNotFound )
                    {
                    MPX_DEBUG1( "CMPXCollectionViewHgImp::DoHandleCollectionMessageL calling OpenL EMcPathChangedByCollectionChange" );
                    if( iContainer->CurrentSelectionIndicesL()->Count() )
                        {
                        HandleCommandL( EAknUnmarkAll );
                        }
                    // dismiss find pane if it's visible
                    if( iContainer->FindBoxVisibility() )
                        {
                        iContainer->EnableFindBox( EFalse );
                        }
                    DoIncrementalOpenL();
                    }
                else
                    {
                    MPX_DEBUG4( "CMPXCollectionViewHgImp::DoHandleCollectionMessageL PathChange Message Ignored iIsDeleting = %d, iCurrentPlaylistOp = %d, iIsSavingReorderPlaylist = %d", iIsDeleting, iCurrentPlaylistOp, iIsSavingReorderPlaylist );
                    MPX_DEBUG2( "CMPXCollectionViewHgImp::DoHandleCollectionMessageL PathChange Message Ignored iSetMediaLCount = %d", iSetMediaLCount );
                    }
                }
            else if ( event == TMPXCollectionMessage::EPathChanged &&
                 type == EMcPathChangedByOpen &&
                 data == EMcItemOpened)
                {
                // opened a song, revert back one level when collection view
                // is activated again
                iIncrementalOpenUtil->Stop();
                iBackOneLevel = ETrue;
                }
            else if( event == TMPXCollectionMessage::EBroadcastEvent )
                {
                MPX_DEBUG2( "CMPXCollectionViewHgImp::DoHandleCollectionMessageL - broadcast type = %d", type );
                if ( type == EMcMsgDiskRemoved &&
                     iViewUtility->ActiveViewType() != TUid::Uid(KMPXPluginTypeWaitNoteDialogUid) )
                    {
                    AknDialogShutter::ShutDialogsL( *CEikonEnv::Static() );
                    }
                if ( iConfirmationDlg && ( type == EMcMsgUSBMTPStart || type == EMcMsgUSBMassStorageStart ) )
                    {
                    TKeyEvent kEvent;
                    kEvent.iCode = EKeyEscape;
                    kEvent.iScanCode = EStdKeyEscape;
                    iConfirmationDlg->OfferKeyEventL( kEvent, EEventKey );
                    }

                }
        else if ( event == TMPXCollectionMessage::EFocusChanged && iContainer && iCoverDisplay )
            {
            if ( data != KErrNotFound &&
                 data < iContainer->CurrentListItemCount() &&
                 !iIgnoreNextFocusChangedMessage )
                {
                MPX_DEBUG2( "CMPXCollectionViewHgImp::DoHandleCollectionMessageL - EFocusChanged to %d", data );
                iContainer->SetLbxCurrentItemIndexAndDraw( data );
                }
            iIgnoreNextFocusChangedMessage = EFalse;
            }
            } // if iContainer

        // System events need to be checked regardless of iContainer
        //
        if( event == TMPXCollectionMessage::EBroadcastEvent )
            {
            if((type == EMcMsgUSBMassStorageStart ) || (type == EMcMsgUSBMTPEnd) || (type == EMcMsgRefreshEnd))
                {
                iCollectionCacheReady = EFalse;
                }
            // USB flags
            //
	       CEikMenuBar* menuBar( MenuBar() );
#ifdef SINGLE_CLICK_INCLUDED
            iContainer->EnableMarking( EFalse );
            menuBar->SetMenuTitleResourceId( R_MPX_COLLECTION_VIEW_MENUBAR_NO_MARKING );
#else
            iContainer->EnableMarking( ETrue );
            menuBar->SetMenuTitleResourceId( R_MPX_COLLECTION_VIEW_MENUBAR );
#endif
	        TBool IsUSBEvent( EFalse );
            if( type == EMcMsgUSBMassStorageStart || type == EMcMsgUSBMTPStart )
                {
                iUSBOnGoing = ETrue;
		        IsUSBEvent = ETrue;
                }
            else if( type == EMcMsgUSBMassStorageEnd || type == EMcMsgUSBMTPEnd )
                {
                iUSBOnGoing = EFalse;
		        IsUSBEvent = ETrue;
                RProperty::Set( KMPXViewPSUid,
                                KMPXUSBUnblockingPSStatus,
                                EMPXUSBUnblockingPSStatusUninitialized );
                }
            else if( type == EMcMsgUSBMTPNotActive )
                {
		        IsUSBEvent = ETrue;
                RProperty::Set( KMPXViewPSUid,
                                KMPXUSBUnblockingPSStatus,
                                EMPXUSBUnblockingPSStatusActive );
		        }
            if( IsUSBEvent && menuBar && menuBar->IsDisplayed() )
            	{
            	menuBar->StopDisplayingMenuBar();
            	}

            if ( iContainer && iIsEmbedded && type == EMcMsgUSBMassStorageEnd )
            	{
            	DoIncrementalOpenL();
            	}
            } // if event == EBroadcastEvent
        } // if ( KMPXMessageGeneral == id )
    }

// ---------------------------------------------------------------------------
// CMPXCollectionViewHgImp::DoIncrementalOpenL
// Start the incremental fetching algorithm
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::DoIncrementalOpenL( TBool aShowWaitDlg )
    {
     MPX_FUNC( "CMPXCollectionViewHgImp::DoIncrementalOpenL" );
    // Show the opening note if > 1.5 seconds
    if( aShowWaitDlg )
        {
        //StartWaitNoteL( EMPXOpeningNote );
        }

    // Cancel any reads
    iIncrementalOpenUtil->Stop();

    // Start the read
    RArray<TMPXAttribute> attrs;
    CleanupClosePushL( attrs );
    TArray<TMPXAttribute> ary = attrs.Array();
    iIncrementalOpenUtil->SetDelay( KIncrementalDelayNone );
    iIncrementalOpenUtil->StartL( ary, KIncrementalFetchBlockSize,
                                  KErrNotFound, CMPXCollectionOpenUtility::EFetchNormal );
    iIncrementalOpenUtil->SetDelay( KIncrementalDelayHalfSecond );
    CleanupStack::PopAndDestroy( &attrs );

    // Default empty text
    iContainer->SetLbxEmptyTextL( KNullDesC );
    iContainer->DrawDeferred();
    iFirstIncrementalBatch = ETrue;
    }

// -----------------------------------------------------------------------------
// Start wait note for delayed action due to the items not ready
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::StartDelayedActionL(
    TInt aCommand, TDesC& aNote,TBool aSkipDisplay  )
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::StartDelayedActionL" );
    HandleCommandL( EMPXCmdIgnoreExternalCommand );
    if(!aSkipDisplay)
        {
    	iCommonUiHelper->ShowWaitNoteL( aNote, R_AVKON_SOFTKEYS_EMPTY, ETrue, this );
        }

    iCachedCommand = aCommand;
    const CArrayFix<TInt>* array (
        iContainer->CurrentSelectionIndicesL() ); // not owned
    TInt arrayCount( array->Count() );
    iCachedSelectionIndex->Reset();
    for ( TInt i = 0; i < arrayCount; i++ )
        {
        iCachedSelectionIndex->AppendL( array->At( i ) );
        }
    }

// ---------------------------------------------------------------------------
// From MProgressDialogCallback
// Callback method. Get's called when a dialog is dismissed
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::DialogDismissedL( TInt aButtonId )
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::DialogDismissedL" );
    if ( iCommandInitiator )
        {
        iCommandInitiator->CancelCommand( KMediatorSecondaryDisplayDomain,
                                      KMPlayerNoteCategory,
                                      iWaitNoteId );
        }

    switch ( aButtonId )
        {
        case EAknSoftkeyCancel:
            {
            iIsWaitNoteCanceled = ETrue;
            if( iIsDeleting )
                {
                iCollectionUiHelper->Cancel();
                iIsDeleting = EFalse;
                // if delete is interrupted, reopen
                }
            else if ( iSetMediaLCount > 0 )
                {
                // cancel the async request
                iCollectionUtility->Collection().CancelRequest();
                iSetMediaLCount = KErrNotFound;

                DoIncrementalOpenL();
                }
            else if ( iIsAddingToPlaylist )
                {
                // cancel incremental adding of songs
                iCommonUiHelper->CancelCollectionOperation();
                iIsAddingToPlaylist = EFalse;
                }
            break;
            }
        default:
            {
            // no special handling for other cases
            break;
            }
        }
    }

// ---------------------------------------------------------------------------
// From MMPXCollectionObserver
// Handle collection message
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::HandleCollectionMessage(
    CMPXMessage* aMessage, TInt aError )
    {
    if ( aError == KErrNone && aMessage )
        {
        TRAP_IGNORE( DoHandleCollectionMessageL( *aMessage ) );
        }
    }

// ---------------------------------------------------------------------------
// From MMPXCollectionObserver
// Handles the collection entries being opened. Typically called
// when client has Open()'d a folder
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::HandleOpenL(
    const CMPXMedia& aEntries,
    TInt aIndex,
    TBool aComplete,
    TInt aError )
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::HandleOpenL 4" );
    iHandlingKeyEvent = EFalse;
    if( aError == KErrNone )
        {
        if ( !iContainer )
            {
            // View is not active. Ignore.
            return;
            }
        // handle deferred notification when view is in focus but not for view transitions
        if ( iActivateBackStepping )
            {
	        HandleBacksteppingActivation();
		    }

        iCollectionReady = aComplete;
#ifdef __ENABLE_PODCAST_IN_MUSIC_MENU
        if( iPodcast && !iDisablePodcasting )
            {
            iPodcast = EFalse;
            UpdateListBoxL( aEntries, KMusicMenuPodcastMenuItemIndex, aComplete );
            ( void ) aIndex;
            }
        else
            {
            UpdateListBoxL( aEntries, aIndex, aComplete );
            }
#else
        UpdateListBoxL( aEntries, aIndex, aComplete );
#endif // __ENABLE_PODCAST_IN_MUSIC_MENU
        if ( iContainer )
            {
            iContainer->ContentIsReady( ETrue );
            // this has to be done after the list box media is properly
            // updated
            if ( !iContainer->FindBoxVisibility() )
                {
                MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleOpenL find box not visible" );
#ifdef __ENABLE_PODCAST_IN_MUSIC_MENU
                CMPXCollectionPath* cpath( iCollectionUtility->Collection().PathL() );
                CleanupStack::PushL( cpath );

                CMPXCommonListBoxArrayBase* listboxArray(
                    iContainer->ListBoxArray() );
                const CMPXMedia& media( listboxArray->ContainerMedia() );

                TMPXGeneralType containerType( EMPXNoType );
                if ( media.IsSupported( KMPXMediaGeneralType ) )
                    {
                    containerType = media.ValueTObjectL<TMPXGeneralType>( KMPXMediaGeneralType );
                    }

                TMPXGeneralCategory containerCategory( EMPXNoCategory );
                if ( media.IsSupported( KMPXMediaGeneralCategory ) )
                    {
                    containerCategory = media.ValueTObjectL<TMPXGeneralCategory>( KMPXMediaGeneralCategory );
                    }
                TBool landscapeOrientation = Layout_Meta_Data::IsLandscapeOrientation();
                CEikButtonGroupContainer* cba = Cba();
                if ( cba && containerType == EMPXGroup && containerCategory == EMPXAlbum && landscapeOrientation )
                    {
                    cba->SetCommandSetL( R_MPX_COLLECTION_TRANSPARENT_CBA );
                    cba->MakeVisible( EFalse );
					cba->DrawDeferred();
                    }
                else if ( cba )
                    {
                    cba->SetCommandSetL(
                        ( cpath->Levels() == 3 && !iIsEmbedded ) ?
                        R_MPX_OPTIONS_HIDE_CBA : R_AVKON_SOFTKEYS_OPTIONS_BACK );
                    cba->MakeVisible( ETrue );
                    cba->DrawDeferred();
                    }

                CleanupStack::PopAndDestroy(cpath);
#else
                CEikButtonGroupContainer* cba = Cba();
                if ( cba )
                    {
                    cba->SetCommandSetL(
                        ( iViewUtility->ViewHistoryDepth() == 1 && !iIsEmbedded ) ?
                        R_AVKON_SOFTKEYS_OPTIONS_EXIT : R_AVKON_SOFTKEYS_OPTIONS_BACK );
                    cba->DrawDeferred();
                    }
#endif
                }
            else
                {
                MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleOpenL find box visible" );
                }

            CMPXCommonListBoxArrayBase* array(
                iContainer->ListBoxArray() );
            const CMPXMedia& containerMedia = array->ContainerMedia();
            if ( containerMedia.IsSupported( KMPXMediaGeneralTitle ) )
                {
                delete iTitle;
                iTitle = NULL;
                iTitle = containerMedia.ValueText( KMPXMediaGeneralTitle ).AllocL();
                }
            if ( !iContainer->IsInReorderMode() &&
                !iAddingSong &&
                !iInAlbumArtDialog &&
                !iInSongDetails )
                {
                UpdateTitlePaneL();
                }

            TMPXGeneralType containerType( EMPXNoType );
            if( containerMedia.IsSupported( KMPXMediaGeneralType ) )
                {
                containerType = containerMedia.ValueTObjectL<TMPXGeneralType>(
                                KMPXMediaGeneralType );
                }

            TMPXGeneralCategory containerCategory( EMPXNoCategory );
            if( containerMedia.IsSupported( KMPXMediaGeneralCategory ) )
                {
                containerCategory = containerMedia.ValueTObjectL<TMPXGeneralCategory>(
                                    KMPXMediaGeneralCategory );
                }
            MPX_DEBUG3( "CMPXCollectionViewHgImp::HandleOpenL container type = %d, category = %d", containerType, containerCategory );

            CEikMenuBar* menuBar( MenuBar() );
            TInt resId( KErrNotFound );
#ifdef __ENABLE_MSK
            TInt mskId( R_QTN_MSK_OPEN );
#endif // __ENABLE_MSK
            if ( iIsEmbedded )
                {
                // embedded playlist view
                iContainer->EnableMarking( ETrue );
                menuBar->SetMenuTitleResourceId( R_MPX_COLLECTION_VIEW_MENUBAR_EMBEDDED_PLAYLIST_VIEW );
                resId = R_MPX_COLLECTION_SONG_LBX_EMPTYTEXT;
#ifdef __ENABLE_MSK
                mskId = R_QTN_MSK_PLAY;
#endif // __ENABLE_MSK
                }
            else
                {
                if ( containerType == EMPXGroup && containerCategory == EMPXCollection )
                    {
                    // music menu view
                    iContainer->EnableMarking( EFalse );
                    menuBar->SetMenuTitleResourceId( R_MPX_COLLECTION_VIEW_MENUBAR_MUSIC_MENU );
                    }
                else if ( ( containerType == EMPXGroup && containerCategory == EMPXPlaylist ) || // playlist view
                    ( containerType == EMPXGroup && containerCategory == EMPXArtist ) || // artist view
                    ( containerType == EMPXItem && containerCategory == EMPXArtist ) || // artist/album view
                    ( containerType == EMPXGroup && containerCategory == EMPXAlbum ) || // album view
                    ( containerType == EMPXGroup && containerCategory == EMPXGenre ) || // genre view
                    ( containerType == EMPXGroup && containerCategory == EMPXComposer ) ) // composer view
                    {
                    iContainer->EnableMarking( EFalse );
                    menuBar->SetMenuTitleResourceId( R_MPX_COLLECTION_VIEW_MENUBAR_NO_MARKING );
                    switch ( containerCategory )
                        {
                        case EMPXArtist:
                            {
                            if ( containerType == EMPXGroup )
                                {
                                // artist view
                                resId = R_MPX_COLLECTION_ARTIST_LBX_EMPTYTEXT;
                                }
                            else if ( containerType == EMPXItem )
                                {
                                // artist/album view
                                resId = R_MPX_COLLECTION_ALBUM_LBX_EMPTYTEXT;
                                }
                            else
                                {
                                // should not reach here
                                ASSERT( 0 );
                                }
                            break;
                            }
                        case EMPXAlbum:
                            {
                            // album view
                            resId = R_MPX_COLLECTION_ALBUM_LBX_EMPTYTEXT;
                            break;
                            }
                        case EMPXGenre:
                            {
                            // genre view
                            resId = R_MPX_COLLECTION_GENRE_LBX_EMPTYTEXT;
                            break;
                            }
                        case EMPXComposer:
                            {
                            // composer view
                            resId = R_MPX_COLLECTION_COMPOSER_LBX_EMPTYTEXT;
                            break;
                            }
                        case EMPXPlaylist:
                            {
                            // no special handling for playlist
                            break;
                            }
                        default:
                            {
                            // should not reach here
                            ASSERT( 0 );
                            break;
                            }
                        }
                    }
                else
                    {
                    // tracks view
#ifdef SINGLE_CLICK_INCLUDED
                    iContainer->EnableMarking( EFalse );
                    menuBar->SetMenuTitleResourceId( R_MPX_COLLECTION_VIEW_MENUBAR_NO_MARKING );
#else
                    iContainer->EnableMarking( ETrue );
                    menuBar->SetMenuTitleResourceId( R_MPX_COLLECTION_VIEW_MENUBAR );
#endif
                    resId = R_MPX_COLLECTION_SONG_LBX_EMPTYTEXT;
#ifdef __ENABLE_MSK
                    mskId = R_QTN_MSK_PLAY;
#endif // __ENABLE_MSK
                    }
                }

            if ( resId != KErrNotFound )
                {
                HBufC* emptyText = StringLoader::LoadLC( resId );
                iContainer->SetLbxEmptyTextL( *emptyText );
                CleanupStack::PopAndDestroy( emptyText );
                iContainer->DrawDeferred();
                }

#ifdef __ENABLE_MSK
            // set middle softkey label display
            UpdateMiddleSoftKeyDisplayL( mskId );
#endif // __ENABLE_MSK

            switch ( iCurrentPlaylistOp )
                {
                case EMPXOpPLCreating:
                    {
                    MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleOpenL searching for playlist" );
                    // after creating a new playlist
                    // playlist created callback will always come before this
                    // iPlaylistId should have already been set, check to see if
                    // we're in playlist view
                    if ( iPlaylistId != 0 &&
                        containerType == EMPXGroup && containerCategory == EMPXPlaylist )
                        {
                        const CMPXMediaArray& mediaArray = array->MediaArray();
                        TInt arrayCount( mediaArray.Count() );
                        for ( TInt i = 0; i < arrayCount; i++ )
                            {
                            CMPXMedia* origMedia( mediaArray.AtL( i ) );
                            TMPXItemId plId = origMedia->ValueTObjectL<TMPXItemId>(
                                KMPXMediaGeneralId );
                            if ( plId == iPlaylistId )
                                {
                                MPX_DEBUG2( "CMPXCollectionViewHgImp::HandleOpenL Playlist match found 0x%x", iPlaylistId.iId1 );
                                iCurrentPlaylistOp = EMPXOpPlOpening;
                                iContainer->SetLbxCurrentItemIndex( i );
                                HandleListBoxEventL( NULL, // not used
                                    EEventEnterKeyPressed );
                                break;
                                }

                            // Stay in Creating state as every OpenL()
                            // will be called back with a HandleOpenL()
                            // During playlist creation, there is a race condition
                            // between HandleCollectionMessage() -> Collection change -> OpenL()
                            // and playlist added's  OpenL()
                            }
                        }
                    break;
                    }
                case EMPXOpPlOpening:
                    {
                    // check how many songs are stored in collection
                    iCurrentMediaLOp = EMPXOpMediaLNewPlaylistCollectionSongCount;
                    CMPXCollectionPath* path = iCollectionUtility->Collection().PathL();
                    CleanupStack::PushL( path );
                    path->Back();
                    RArray<TMPXAttribute> attrs;
                    CleanupClosePushL( attrs );
                    attrs.Append( KMPXMediaColDetailNumberOfItems );
                    iCollectionUtility->Collection().MediaL( *path, attrs.Array() );
                    CleanupStack::PopAndDestroy( &attrs );
                    CleanupStack::PopAndDestroy( path );
                    iCurrentPlaylistOp = EMPXOpPLIdle;
                    break;
                    }
                case EMPXOpPLIdle: // fall through
                default:
                    {
                    // Update Duration
                    //
                    if ( !iContainer->IsInReorderMode() && !iAddingSong )
                        {
                        GetDurationL();
                        }
                    break;
                    }
                }
            iPlaylistId = 0;
            }
        }
    else
        {
        if ( iContainer )
            {
#ifdef __ENABLE_PODCAST_IN_MUSIC_MENU
            CMPXCollectionPath* cpath( iCollectionUtility->Collection().PathL() );
            CleanupStack::PushL( cpath );

            // media is not valid until the first HandleOpenL call
            CEikButtonGroupContainer* cba = Cba();
            if ( cba )
                {
                cba->SetCommandSetL(
                    ( cpath->Levels() == 2 && !iIsEmbedded ) ?
                    R_AVKON_SOFTKEYS_OPTIONS_BACK : R_AVKON_SOFTKEYS_OPTIONS_BACK );
                cba->DrawDeferred();
                }

            CleanupStack::PopAndDestroy(cpath);
#else
            CEikButtonGroupContainer* cba = Cba();
            if ( cba )
                {
                cba->SetCommandSetL(
                    ( iViewUtility->ViewHistoryDepth() == 1 && !iIsEmbedded ) ?
                    R_AVKON_SOFTKEYS_OPTIONS_EXIT : R_AVKON_SOFTKEYS_OPTIONS_BACK );
                cba->DrawDeferred();
                }

#endif
            }
        if (aError == KErrNotFound)
            {
            HandleCommandL(EAknSoftkeyBack);
            }
        else
            {
            HandleError( aError );
            }
        }
    if ( iIsDeleting )
        {
        // nothing else to delete
        iIsDeleting = EFalse;
        if ( iProgressDialog )
            {
            iProgressDialog->ProcessFinishedL();
            }
        HandleCommandL( EMPXCmdHandleExternalCommand );
        }
    if ( iPlayIndex > KErrNotFound )
        {
        CMPXCollectionPath* cpath( iCollectionUtility->Collection().PathL() );
        CleanupStack::PushL( cpath );
        cpath->Set( iPlayIndex );
        iPlayIndex = KErrNotFound;
        iCollectionUtility->Collection().OpenL( *cpath, EMPXOpenPlaylistOnly );
        iFirstIncrementalBatch = ETrue;
        CleanupStack::PopAndDestroy( cpath );
        }
    if ( ( iCachedCommand != KErrNotFound ) && iCollectionReady )
        {
        if((iCachedCommand != EMPXCmdRemove) && (iCachedCommand != EMPXCmdCommonDelete) && (iCachedCommand != EMPXCmdDelete) )
            {
        iCommonUiHelper->DismissWaitNoteL();
        HandleCommandL( EMPXCmdHandleExternalCommand );
            }
        else
            {
            iCachedCommand = EMPXCmdRemove;
            }
        if( iContainer )
            {
            iContainer->SetCurrentSelectionIndicesL( iCachedSelectionIndex );
            }
        HandleCommandL( iCachedCommand );
        iCachedSelectionIndex->Reset();
        iCachedCommand = KErrNotFound;
        }

    // Close the opening wait note, if the current item is valid or all open completes
    if ( iContainer && !aComplete )
        {
        // if the list is empty, it shouldn't go in this path as aComplete should be ETrue
        CMPXCommonListBoxArrayBase* listboxArray(
            iContainer->ListBoxArray() );
        const CMPXMedia& currentMedia( listboxArray->MediaL( aIndex ) );
        }
    else
        {
        if ( EMPXOpeningNote == iNoteType || EMPXImmediatelyOpeningNote == iNoteType )
            {
            CloseWaitNoteL();
            }
        }

    MPX_PERF_CHECKPT("Collection View opened");
    }

// ---------------------------------------------------------------------------
// From MMPXCollectionObserver
// Handles the collection entries being opened.
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::HandleOpenL(
    const CMPXCollectionPlaylist& /*aPlaylist*/,
    TInt /*aError*/ )
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::HandleOpenL 2" );
    iHandlingKeyEvent = EFalse;
    // Do Nothing: playback/fetch client should handle this stage
    }

// ---------------------------------------------------------------------------
// From MMPXCollectionObserver
// Handle media properties
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::HandleCollectionMediaL(
    const CMPXMedia& aMedia,
    TInt aError)
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::HandleCollectionMediaL" );

    TInt nextMediaLOp( EMPXOpMediaLIdle );
    if ( aError == KErrNone )
        {
        switch ( iCurrentMediaLOp )
            {
            case EMPXOpMediaLGetContainerInfo:
                {
                delete iDuration;
                iDuration = NULL;
                if ( aMedia.IsSupported( KMPXMediaGeneralDuration ) )
                    {
                    TInt duration(
                        aMedia.ValueTObjectL<TInt>( KMPXMediaGeneralDuration ) );
                    if ( duration > 0 )
                        {
                        // only display duration when the list contains something
                        iDuration = iCommonUiHelper->DisplayableDurationInTextL( duration/KMilliSecondsToSeconds );
                        }
                    }
                UpdateNaviPaneL();
                break;
                }
            case EMPXOpMediaLSend:
                {
                DoHandleSendL( aMedia );
                if ( !iContainer->FindBoxVisibility() )
                    {
                    iContainer->RestoreFindBoxPopupCBA();
                    }
                break;
                }
            case EMPXOpMediaLSongDetailsFileCheck:
                {
                if ( iContainer )
                    {
                    DoHandleFileCheckResultL(
                        TUid::Uid( KMPXPluginTypeMetadataEditorUid ), aMedia );
                    if ( !iContainer->FindBoxVisibility() )
                        {
                        iContainer->RestoreFindBoxPopupCBA();
                        }
                    }
                break;
                }
            case EMPXOpMediaLAlbumArtFileCheck:
                {
                if ( iContainer )
                    {
                    DoHandleFileCheckResultL(
                        TUid::Uid( KMPXPluginTypeAlbumArtEditorUid ), aMedia );

                    if ( !iContainer->FindBoxVisibility() )
                        {
                        iContainer->RestoreFindBoxPopupCBA();
                        }
                    }
                break;
                }
            case EMPXOpMediaLCollectionDetails:
                {
                DoShowCollectionDetailsL( aMedia );
                break;
                }
            case EMPXOpMediaLPlaylistDetails:
                {
                DoShowPlaylistDetailsL( aMedia );
                break;
                }
            case EMPXOpMediaLRenamePlaylist:
                {
                DoHandleRenamePlaylistL( aMedia );
                break;
                }
            case EMPXOpMediaLNewPlaylistCollectionSongCount:
                {
                TInt songsCount( 0 );
                if ( aMedia.IsSupported( KMPXMediaColDetailNumberOfItems ) )
                    {
                    songsCount =
                        aMedia.ValueTObjectL<TInt>( KMPXMediaColDetailNumberOfItems );
                    }
                if ( songsCount > 0 )
                    {
                    // show add songs prompt only if collection contains
                    // at least one song
                    MPX_DEBUG2( "CMPXCollectionViewHgImp::HandleCollectionMediaL openning add songs view, collection contains %d songs", songsCount );
                    CAknQueryDialog* confirmationDlg = CAknQueryDialog::NewL(
                        CAknQueryDialog::EConfirmationTone );
                    CleanupStack::PushL( confirmationDlg );
                    HBufC* promptTxt = StringLoader::LoadLC(
                        R_MPX_QTN_NMP_QUERY_ADD_SONGS );
                    confirmationDlg->SetPromptL( *promptTxt );
                    CleanupStack::PopAndDestroy( promptTxt );
                    confirmationDlg->PublishDialogL(
                        EMPlayerQueryAddSongsToPlaylist,
                        KMPlayerNoteCategory);
                    CleanupStack::Pop( confirmationDlg );
                    AppUi()->StopDisplayingMenuBar();
                    if ( confirmationDlg->ExecuteLD( R_MPX_CUI_ADD_SONGS_CONFIRMATION_QUERY ) )
                        {
                        HandleCommandL( EMPXCmdAddSongs );
                        iCurrentMediaLOp = EMPXOpMediaLNewPlaylistCollectionSongCount;
                        }
                    }
#ifdef _DEBUG
                else
                    {
                    MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleCollectionMediaL collection empty, not opening add songs view" );
                    }
#endif // _DEBUG
                break;
                }
            case EMPXOpMediaLCopyToRemote:
                {
                if ( iUpnpFrameworkSupport )
                    {
                    DoHandleCopyToRemoteL( aMedia );
                    }
                break;
                }

            case EMPXOpMediaLFindInMusicShopSongDetails:
                {
                const TDesC& location = aMedia.ValueText( KMPXMediaGeneralUri );
                if ( location != KNullDesC && ConeUtils::FileExists( location ) )
                    {
                    HBufC* buf = HBufC::NewLC( 5 ); // magic number to hold index value
                    buf->Des().AppendNum(
                        iContainer->CurrentLbxItemIndex() );
                    // set current list box index
                    SetParamL( buf );
                    CleanupStack::PopAndDestroy( buf );

                    DoGetSongMediaPropertyL();
                    // Set the next operation to handle MediaL completed.
                    nextMediaLOp = EMPXOpMediaLFindInMusicShopMediaLCompleted;
                    }
                else
                    {
                    CMPXCollectionPath* cpath = iCollectionUtility->Collection().PathL();
                    CleanupStack::PushL( cpath );
                    TInt currentDepth( cpath->Levels() );
                    CleanupStack::PopAndDestroy( cpath );
                    CMPXCommonListBoxArrayBase* listboxArray =
                        iContainer->ListBoxArray();
                    TInt currentIndex =
                        iContainer->CurrentLbxItemIndex();
                    const CMPXMedia& currentMedia = listboxArray->MediaL( currentIndex );
                    TMPXGeneralCategory category(
                        currentMedia.ValueTObjectL<TMPXGeneralCategory>( KMPXMediaGeneralCategory ) );
                    const CMPXMediaArray& mediaAry( listboxArray->MediaArray() );
                    CMPXMedia* origMedia( mediaAry.AtL( currentIndex ) );
                    const TDesC& title( origMedia->ValueText( KMPXMediaGeneralTitle ) );
                    if ( ( title.Length() > 0 ) && ( title.Length() < KMaxFileName ) )
                        {
                        switch ( category )
                            {
                            case EMPXAlbum:
                                {
                                const CMPXMedia& containerMedia = listboxArray->ContainerMedia();
                                // The Artist/Album View Title shows the Artist name
                                const TDesC& titleArtist =
                                        containerMedia.ValueText( KMPXMediaGeneralTitle );
                                HBufC* unknownArtistText =
                                        StringLoader::LoadLC( R_MPX_QTN_NMP_UNKNOWN_ARTIST );
                                // 4 is the level of Artist and Album View
                                if ( currentDepth == 4 && titleArtist != unknownArtistText->Des() )
                                    {
                                    DoFindInMusicShopL(KCategoryEmpty, titleArtist, title); // Artist and Album View
                                    }
                                else
                                    {
                                    DoFindInMusicShopL(KCategoryEmpty, KCategoryEmpty, title); // Album View
                                    }
                                CleanupStack::PopAndDestroy( unknownArtistText );
                                break;
                                }
                            case EMPXArtist:
                                {
                                DoFindInMusicShopL(KCategoryEmpty, title, KCategoryEmpty);  // Artist only
                                break;
                                }
                            case EMPXSong:
                                {
                                DoFindInMusicShopL(title, KCategoryEmpty, KCategoryEmpty);  // Song only
                                break;
                                }
                            default:
                                {
                                break;
                                }
                            } // switch
                        } // if
                    }  // else
                break;
                }
            case EMPXOpMediaLFindInMusicShopMediaLCompleted:
                {
                // call DoFindInMusicShop when SongName, AlbumName, and ArtistName are
                // available at this point
                DoFindInMusicShopL(
                    aMedia.ValueText( KMPXMediaGeneralTitle ),
                    aMedia.ValueText( KMPXMediaMusicArtist ),
                    aMedia.ValueText( KMPXMediaMusicAlbum ) );
                break;
                }

            default:
                {
                break;
                }
            }
        }
    else
        {
        /* If a Composer,Artist or Album consists single song.
         * On changing the song details(composer+genre or album name+genre)
         * No more record exist corresponding to previous data.
         * In this case no need to show Error Message. */
        if( aError != KErrNotFound)
            {
            HandleError( aError );
            }
        else
            {
            MPX_DEBUG2( "CMPXCollectionViewHgImp::HandleCollectionMediaL ERROR: %d",aError);
            }
        }
    if ( iCurrentMediaLOp == EMPXOpMediaLNewPlaylistCollectionSongCount )
        {
        iCurrentMediaLOp = EMPXOpMediaLGetContainerInfo;
        }
    else
        {
        iCurrentMediaLOp = nextMediaLOp;
        }
    }

// ---------------------------------------------------------------------------
// From MMPXCollectionHelperObserver
// Callback function after executing a command
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::HandleCommandComplete(CMPXCommand* /*aCommandResult*/,
                                                  TInt /*aError*/)
    {
    // Make sure we are doing the right operation
    if( iSetMediaLCount )
        {
        iSetMediaLCount--;
        if ( iSetMediaLCount < 1 )
            {
            TRAP_IGNORE( HandleRenameOpCompleteL() );
            }
        }
    }
// ---------------------------------------------------------------------------
// From MMPXCollectionHelperObserver
// Callback function to signal that adding a file is complete
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::HandleAddFileCompleteL( TInt aErr )
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::HandleAddFileCompleteL" );
    if ( aErr != KErrNone )
        {
        HandleError( aErr );
        }
    }

// ---------------------------------------------------------------------------
// From MMPXCHelperObserver
// Handles the completion of helper events
// ---------------------------------------------------------------------------
//

void CMPXCollectionViewHgImp::HandleOperationCompleteL( TCHelperOperation aOperation,
                                           TInt aErr,
                                           void* aArgument )
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::HandleOperationCompleteL" );
    MPX_DEBUG2( "CMPXCollectionViewHgImp::HandleOperationCompleteL aErr = %d", aErr );
    switch( aOperation )
        {
        case EDeleteOp:
            {
            MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleOperationCompleteL Delete operation" );
            // do not dismiss the wait note until HandleOpenL is called,
            // unless it's error case
            delete iCurrentCba;
            iCurrentCba = NULL;
            if( aErr == KErrInUse )
                {
                if ( !iIsWaitNoteCanceled )
                    {
                    // only dismiss wait note if the wait note is not
                    // canceled
                    if ( iProgressDialog )
                        {
                        iProgressDialog->ProcessFinishedL();
                        }
                    HandleCommandL( EMPXCmdHandleExternalCommand );
                    iIsWaitNoteCanceled = EFalse;
                    }
                if ( iIsDeleting )
                    {
                    HBufC* text = StringLoader::LoadLC(
                        ( iContainer->CurrentSelectionIndicesL()->Count() == 0 ) ?
                        R_MPX_COLLECTION_NOTE_DELETE_FAIL : // Single selection
                        R_MPX_COLLECTION_NOTE_DELETE_FAIL_MULTI_SELECTION ); // Multi selection

                    CAknErrorNote* dlg = new ( ELeave ) CAknErrorNote( ETrue );
                    dlg->ExecuteLD( *text );
                    CleanupStack::PopAndDestroy( text );
                    }
                iIsDeleting = EFalse;
                }
            else if ( aErr != KErrNone )
                {
                iIsDeleting = EFalse;
                if ( !iIsWaitNoteCanceled )
                    {
                    if ( iProgressDialog )
                    	{
						iProgressDialog->ProcessFinishedL();
						}
                    HandleCommandL( EMPXCmdHandleExternalCommand );
                    iIsWaitNoteCanceled = EFalse;
                    }
                HandleError( aErr );
                }
            if ( iContainer )
                {
                iContainer->ClearLbxSelection();
                }
            MPX_PERF_END_EX( MPX_PERF_SHOW_WAITNOTE );
            // reopen collection
            DoIncrementalOpenL( !iIsDeleting );
            break;
            }
        case EExportPlaylistOp:
            {
            MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleOperationCompleteL Export playlist operation" );
            if ( aErr == KErrNone )
                {
                HBufC* uri = static_cast<HBufC*>( aArgument );
                CleanupStack::PushL(uri);
                MPX_DEBUG2( "CMPXCollectionViewHgImp::HandleOperationCompleteL playlist exported as %S", uri );

                CMessageData* messageData = CMessageData::NewLC();
                messageData->AppendAttachmentL( *uri );
                RFs& fileSession = iCoeEnv->FsSession();
                TEntry pl;
                TInt err( fileSession.Entry( *uri, pl ) );
                if ( err == KErrNone )
                    {
                    MPX_DEBUG2( "CMPXCollectionViewHgImp::HandleOperationCompleteL playlist size = %d", pl.iSize );
                    if ( !iSendUi )
                        {
                        iSendUi = CSendUi::NewL();
                        }
                    TSendingCapabilities capabilities(
                        0,
                        pl.iSize,
                        TSendingCapabilities::ESupportsAttachments );

                    // sendui leaves with error code 0 when canceling sending
                    // via bluetooth, this should be trapped
                    MPX_TRAP( err, iSendUi->ShowQueryAndSendL( messageData, capabilities ) );
                    if ( err != KErrNone )
                        {
                        HandleError( err );
                        }
                    // remove the file then remove the directory
                    err = fileSession.Delete( *uri );
                    if ( err != KErrNone )
                        {
                        HandleError( err );
                        }
                    err = fileSession.RmDir( *uri );
                    if ( err != KErrNone )
                        {
                        HandleError( err );
                        }
                    }
                else
                    {
                    HandleError( err );
                    }
                CleanupStack::PopAndDestroy( 2, uri ); // messageData & uri
                aArgument = NULL;
                }
            else
                {
                HandleError( aErr );
                }
            break;
            }
        case EAddOp:
            {
            HandleAddCompletedL( (CMPXMedia*)aArgument, aErr );
            aArgument = NULL; // ownership transferred
            iIsAddingToPlaylist = EFalse;  // reset flag once incremental adding is finished
            break;
            }
        case ESetOp:
            {
            if ( iAddingToNewPlaylist )
                {
                // if user selects overwrite existing playlist,
                // the OP will be set, and is handled here
                HandleAddCompletedL( (CMPXMedia*)aArgument, aErr );
                }
            else
                {
                HandleSetCompletedL( (CMPXMedia*)aArgument, aErr );
                }
            aArgument = NULL; // ownership transferred
            break;
            }
        case EReorderPlaylistOp:
            {
            HandleSetCompletedL( (CMPXMedia*)aArgument, aErr );
            aArgument = NULL; // ownership transferred
            break;
            }
        case ERenameOp:
            {
            if ( aErr != KErrNone )
                {
                iCommonUiHelper->HandleErrorL( aErr );
                }
            break;
            }
        case EDeleteStatusOp:
            {
            if ( aArgument )
                {
                CMPXMedia* media = (CMPXMedia*)aArgument;
                CleanupStack::PushL( media );
                if ( media->IsSupported( KMPXMediaGeneralCount ) )
                    {
                    TInt deletePercent = media->ValueTObjectL<TInt>( KMPXMediaGeneralCount );
                    MPX_DEBUG2( "CMPXCollectionViewHgImp::HandleOperationCompleteL % Files Deleted: %d", deletePercent );
                    // update WaitNote dialog.
                    HBufC* string = StringLoader::LoadLC(R_MPX_QTN_NMP_DEL_BATCH_SONGS_WAIT_NOTE, deletePercent);
                    TPtr buf = string->Des();
                    UpdateProcessL(deletePercent, buf);
                    CleanupStack::PopAndDestroy( string );
                    }
                CleanupStack::PopAndDestroy( media );
                aArgument = NULL;
                }
            break;
            }
        default:
            {
            break;
            }
        }

    if( aArgument )
        {
        delete ( CBase* )aArgument;
        }
    }

// ---------------------------------------------------------------------------
// From MMPXPlaybackObserver
// Handle playback message.
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::HandlePlaybackMessage(
    CMPXMessage* aMessage, TInt aError )
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::HandlePlaybackMessage" );
    if ( aError == KErrNone && aMessage )
        {
        TRAP_IGNORE( DoHandlePlaybackMessageL( *aMessage ) );
        }
    // Fix EBLI-7CFE4D press select key very quick cause System Error KErrArgument
    else
        {
        // Fix for EJDI-77WCRF Low memory cause MP not resp.
        iHandlingKeyEvent = EFalse;
        }
    }

// ---------------------------------------------------------------------------
// From MMPXPlaybackCallback
// Handle playback property.
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::HandlePropertyL(
    TMPXPlaybackProperty /*aProperty*/,
    TInt /*aValue*/,
    TInt /*aError*/ )
    {
    // do nothing
    }

// ---------------------------------------------------------------------------
// From MMPXPlaybackCallback
// Method is called continously until aComplete=ETrue, signifying that
// it is done and there will be no more callbacks
// Only new items are passed each time
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::HandleSubPlayerNamesL(
    TUid /* aPlayer */,
    const MDesCArray* /* aSubPlayers */,
    TBool /* aComplete */,
    TInt /* aError */ )
    {
    // do nothing
    }

// ---------------------------------------------------------------------------
// From MMPXPlaybackCallback
// Handle media event.
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::HandleMediaL(
    const CMPXMedia& /*aMedia*/,
    TInt /*aError*/ )
    {
    // do nothing
    }

// ---------------------------------------------------------------------------
// From CAknView
// Returns views id.
// ---------------------------------------------------------------------------
//
TUid CMPXCollectionViewHgImp::Id() const
    {
    return TUid::Uid( KMPXCollectionViewHgId );
    }

// ---------------------------------------------------------------------------
// From CAknView
// Command handling function.
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::HandleCommandL( TInt aCommand )
    {
    MPX_DEBUG2( "CMPXCollectionViewHgImp::HandleCommandL(0x%x) entering", aCommand );

    switch (aCommand)
        {
        case EAknCmdMark:
        case EAknCmdUnmark:
        case EAknMarkAll:
        case EAknUnmarkAll:
            {
            // Custom handling of markable lists
            iContainer->HandleMarkableListProcessCommandL(
                aCommand );
#ifdef __ENABLE_MSK
            // Determine middle soft key labeling
            UpdateMiddleSoftKeyDisplayL( iCurrentMskId );
#endif // __ENABLE_MSK
            if (aCommand == EAknMarkAll && !iCollectionReady)
                {
                iMarkedAll = ETrue;
                }
            if (aCommand == EAknUnmarkAll || aCommand == EAknCmdUnmark)
                {
                iMarkedAll = EFalse;
                }
            break;
            }
        case EMPXCmdGoToNowPlaying:
            {
            AppUi()->HandleCommandL( aCommand );
            break;
            }
        case EMPXCmdGoToAllSongs:
            {
            OpenAllSongsL();
            break;
            }
        case EMPXCmdGoToArtistAlbums:
            {
            OpenArtistAlbumsL();
            break;
            }
        case EMPXCmdGoToPlaylists:
            {
            OpenPlaylistsL();
            break;
            }
        case EMPXCmdGoToGenre:
            {
            OpenGenreL();
            break;
            }
        case EMPXCmdGoToPodcasts:
            {
            OpenPodcastsL();
            break;
            }
#ifdef SINGLE_CLICK_INCLUDED
        case EMPXCmdPlayItem:
            {
            iContainer->HandleItemCommandL(EMPXCmdPlay);
            break;
            }
#endif
        case EMPXCmdCreatePlaylist:
            {
            iCurrentPlaylistOp = EMPXOpPLCreating;
            CMPXMediaArray* mediaArray = CMPXMediaArray::NewL();
            CleanupStack::PushL( mediaArray );
            CMPXMedia* media = CMPXMedia::NewL();
            CleanupStack::PushL( media );
            media->SetCObjectValueL( KMPXMediaArrayContents, mediaArray );
            media->SetTObjectValueL( KMPXMediaArrayCount, 0 );
            TInt ret( iCommonUiHelper->CreatePlaylistL( *media, this, this ) );
            if ( !ret )
                {
                // create playlist failed,
                iCurrentPlaylistOp = EMPXOpPLIdle;
                }
            CleanupStack::PopAndDestroy( media );
            CleanupStack::PopAndDestroy( mediaArray );
            break;
            }
        case EMPXCmdAddToNewPlaylist:
        case EMPXCmdAddToSavedPlaylist:
            {
            // flag used only in the case when songs are added incrementally
            iIsAddingToPlaylist = ETrue;
            iNumSongAddedToPlaylist = -1;
      
            CMPXCommonListBoxArrayBase* listboxArray(
                   iContainer->ListBoxArray() );
                
            const CMPXMedia& currentMedia = listboxArray->MediaL(
                iContainer->CurrentLbxItemIndex() );
            
            TMPXGeneralCategory mediaCategory( currentMedia.ValueTObjectL<TMPXGeneralCategory>( KMPXMediaGeneralCategory ));
                 
            const CMPXMedia& containerMedia = listboxArray->ContainerMedia();
       
            TMPXGeneralType containerType( EMPXNoType );
            if ( containerMedia.IsSupported( KMPXMediaGeneralType ) )
                 {
                 containerType = containerMedia.ValueTObjectL<TMPXGeneralType>( KMPXMediaGeneralType );
                 }

            TMPXGeneralCategory containerCategory( EMPXNoCategory );
            if ( containerMedia.IsSupported( KMPXMediaGeneralCategory ) )
                 {
                 containerCategory = containerMedia.ValueTObjectL<TMPXGeneralCategory>( KMPXMediaGeneralCategory );
                 } 
                            
            if ( mediaCategory == EMPXSong || (containerCategory == EMPXAlbum && containerType== EMPXItem) )
                {
                CMPXMedia* tracks = CMPXMedia::NewL();
                CleanupStack::PushL( tracks );

                MPX_TRAPD( err, PrepareMediaForSelectedItemsL( *tracks, containerCategory, containerType ) );
                if ( err == KErrNone )
                    {
                    TBool ret = EFalse;
                    if ( aCommand == EMPXCmdAddToNewPlaylist )
                        {
                        iAddingToNewPlaylist = ETrue;
                        MPX_TRAP( err,ret = iCommonUiHelper->CreatePlaylistL(
                                *tracks, this, this ) );
                        if ( err != KErrNone )
                            {
                            HandleError( err );
                            }
                        if ( !ret )
                            {
                            iAddingToNewPlaylist = EFalse;
                            }
                        }
                    else
                        {
                        MPX_TRAP( err, ret = iCommonUiHelper->AddToSavedPlaylistL(
                            *iUserPlaylists, *tracks, this, this ) );
                        if ( err != KErrNone )
                            {
                            HandleError( err );
                            }
                        }
#ifdef __ENABLE_MSK
                     // If Save play list or create play list return True (OK)
                     //  1 - Unselect marks
                     //  2 - Force to refresh the MSK with title "Play"
                     // If Save play list or create play list return False (Cancel)
                     //  1 - let the marks
                     //  2 - let the MSK with the "context menu"
                     if (ret)
                       {
                       iContainer->ClearLbxSelection();
                       UpdateMiddleSoftKeyDisplayL( iCurrentMskId );
                       }
#endif // __ENABLE_MSK
                    }
                else if ( err == KMPXErrDataNotReadyCacheCommand )
                    {
                    // cache this command
                    HBufC* text = StringLoader::LoadLC(
                        R_MPX_QTN_MUS_NOTE_ADDING_TRACKS );
                    StartDelayedActionL( aCommand, *text );
                    CleanupStack::PopAndDestroy( text );
                    }
                else if ( err != KMPXErrDataNotReady )
                    {
                    HandleError( err );
                    }
                else
                    {
                    // KMPXErrDataNotReady, ignore
                    }
                CleanupStack::PopAndDestroy( tracks );
                }
            else
                {
                // on artist/album level
                if ( aCommand == EMPXCmdAddToNewPlaylist )
                    {
                    iAddingToNewPlaylist = ETrue;
                    iCurrentFindAllLOp = EMPXOpFindAllLAlbumArtistAddToNewPlaylist;
                    }
                else
                    {
                    iCurrentFindAllLOp = EMPXOpFindAllLAlbumArtistAddToSavedPlaylist;
                    }
                RArray<TMPXAttribute> attrs;
                CleanupClosePushL( attrs );
                attrs.Append(
                    TMPXAttribute( KMPXMediaIdGeneral,
                    EMPXMediaGeneralTitle | EMPXMediaGeneralId |
                    EMPXMediaGeneralType | EMPXMediaGeneralCategory ) );
                CMPXMedia* criteria = CMPXMedia::NewL();
                CleanupStack::PushL( criteria );
                if ( containerCategory == EMPXArtist )
                    {
                    // artist/album level, need to specify artist ID in container ID
                    TMPXItemId containerId(
                        containerMedia.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) );
                    criteria->SetTObjectValueL<TMPXItemId>(
                        KMPXMediaGeneralContainerId, containerId );
                    }
            
                TMPXItemId id(
                    currentMedia.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) );
                criteria->SetTObjectValueL<TMPXGeneralType>(
                    KMPXMediaGeneralType, EMPXGroup );
                criteria->SetTObjectValueL<TMPXGeneralCategory>(
                    KMPXMediaGeneralCategory, EMPXSong );
                criteria->SetTObjectValueL<TMPXItemId>( KMPXMediaGeneralId, id );
                iCollectionUtility->Collection().FindAllL(
                    *criteria, attrs.Array(), *this );
                CleanupStack::PopAndDestroy( criteria );
                CleanupStack::PopAndDestroy( &attrs );
                }
            break;
            }
        case EMPXCmdAddSongs:
            {
            iAddingSong = ETrue;
            iViewUtility->ActivateViewL(
                TUid::Uid( KMPXPluginTypeAddSongsEditorUid ) );
            break;
            }
        case EMPXCmdReorder:
            {
            ActivateReorderGrabbedModeL();
            break;
            }
        case EMPXCmdDelete: // fall through
        case EMPXCmdRemove:
            {
            StoreListboxItemIndexL();
            if ( iContainer->IsTBoneView() )
                {
                DeleteSelectedTBoneItemsL(aCommand);
                }
            else
                {
                DeleteSelectedItemsL(aCommand);    
                }
            break;
            }
        case EMPXCmdSend:
            {
            const CMPXMedia& media =
                iContainer->ListBoxArray()->MediaL(
                    iContainer->CurrentLbxItemIndex() );

            TMPXGeneralType type(
                media.ValueTObjectL<TMPXGeneralType>( KMPXMediaGeneralType ) );
            TMPXGeneralCategory category(
                media.ValueTObjectL<TMPXGeneralCategory>( KMPXMediaGeneralCategory ) );

            if( type == EMPXItem && category == EMPXAlbum && 
                    iContainer->IsTBoneView() )
                {
                const TMPXItemId containerId = media.ValueTObjectL<TMPXItemId>(KMPXMediaGeneralId);
                DoSendTBoneListItemL(containerId);
                }
            else if ( iContainer->CurrentSelectionIndicesL()->Count() == 0 &&
                type == EMPXItem &&
                category == EMPXPlaylist )
                {
                // sending a playlist
                DoSendPlaylistL( media.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) );
                }
            else
                {
                DoSendL();
                }
            break;
            }
        case EMPXCmdSongDetails: // fall through
        case EMPXCmdAlbumArt: // fall through
        case EMPXCmdFindInMusicShop:
            {
            StoreListboxItemIndexL();

            CMPXCommonListBoxArrayBase* listboxArray(
                iContainer->ListBoxArray() );
            const CMPXMedia& media( listboxArray->MediaL(
                iContainer->CurrentLbxItemIndex() ) );
            if ( media.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) == KMPXInvalidItemId )
                {
                // highlighted item is not yet available
                MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleCommandL item not yet fetched" );
                }
            else
                {
                // need to check if the file exists.  if the file doesn't exist
                // and mediaL is called with drm status, it'll leave
                if ( aCommand == EMPXCmdSongDetails )
                    {
                    iCurrentMediaLOp = EMPXOpMediaLSongDetailsFileCheck;
                    iInSongDetails = ETrue;
                    }
                else if ( aCommand == EMPXCmdAlbumArt )
                    {
                    iInAlbumArtDialog = ETrue;
                    iCurrentMediaLOp = EMPXOpMediaLAlbumArtFileCheck;
                    }
                else if ( aCommand == EMPXCmdFindInMusicShop )
                    {
                    iCurrentMediaLOp = EMPXOpMediaLFindInMusicShopSongDetails;
                    }
                CMPXCollectionPath* path = iCollectionUtility->Collection().PathL();
                CleanupStack::PushL( path );
                path->Set( iContainer->CurrentLbxItemIndex() );
                RArray<TMPXAttribute> attrs;
                CleanupClosePushL( attrs );
                attrs.Append(
                    TMPXAttribute( KMPXMediaIdGeneral,
                        EMPXMediaGeneralUri | EMPXMediaGeneralCollectionId ) );
                iCollectionUtility->Collection().MediaL( *path, attrs.Array() );
                CleanupStack::PopAndDestroy( &attrs );
                CleanupStack::PopAndDestroy( path );
                }
            break;
            }
        case EMPXCmdGoToMusicShop:
            {
            LaunchMusicShopL();
            break;
            }
        case EMPXCmdGoToNokiaMusicShop:
            {
            LaunchMusicShopL();
            break;
            }
        case EMPXCmdGoToOperatorMusicShop:
            {
            if(iMusicStoreWebPage)
                {
                LaunchOperatorURLMusicShopL();
                }
            else
                {
                if(iOperatorMusicStoreType)
                {
                LaunchOperatorJavaMusicShopL(iOperatorMusicStoreUID);
                }
            else
                {
                LaunchOperatorNativeMusicShopL();
                }
                }
            break;
            }
        case EMPXCmdMusicLibraryDetails:
            {
            iCurrentMediaLOp = EMPXOpMediaLCollectionDetails;
            CMPXCollectionPath* path = iCollectionUtility->Collection().PathL();
            CleanupStack::PushL( path );
            RArray<TMPXAttribute> attrs;
            CleanupClosePushL( attrs );
            attrs.Append( KMPXMediaColDetailAll );
            iCollectionUtility->Collection().MediaL( *path, attrs.Array() );
            CleanupStack::PopAndDestroy( &attrs );
            CleanupStack::PopAndDestroy( path );
            break;
            }
        case EMPXCmdRename:
            {
            DoHandleRenameL();
            break;
            }
        case EMPXCmdPlaylistDetails:
            {
            iCurrentMediaLOp = EMPXOpMediaLPlaylistDetails;
            CMPXCollectionPath* path = iCollectionUtility->Collection().PathL();
            CleanupStack::PushL( path );
            path->Set( iContainer->CurrentLbxItemIndex() );
            RArray<TMPXAttribute> attrs;
            CleanupClosePushL( attrs );
            attrs.Append( TMPXAttribute( KMPXMediaIdGeneral,
                EMPXMediaGeneralCount | EMPXMediaGeneralTitle |
                EMPXMediaGeneralUri | EMPXMediaGeneralDate |
                EMPXMediaGeneralDuration | EMPXMediaGeneralFlags ) );
            iCollectionUtility->Collection().MediaL( *path, attrs.Array() );
            CleanupStack::PopAndDestroy( &attrs );
            CleanupStack::PopAndDestroy( path );
            break;
            }
        case EAknSoftkeyBack:
            {
            iMarkedAll = EFalse;
            if( iIsDeleting )
            	{
            	break;
            	}

            if ( iIsEmbedded )
                {
                AppUi()->HandleCommandL(
                    ( MPXTlsHelper::NeedSave() && iCommonUiHelper->IsHostMessagingBrowserL() )
                    ? EMPXCmdSaveAndExit : EEikCmdExit );
                }
            else
                {
                if ( !iHandlingKeyEvent )
                    {
                    CMPXCollectionPath* cpath = iCollectionUtility->Collection().PathL();
                    CleanupStack::PushL( cpath );
                    TInt currentDepth( cpath->Levels() );
                    if ( currentDepth == 2 ) // 2 is the level of music main view
                        {
                        // let Back Stepping Service handle the event
                        TInt statusInfo( KMPXBackSteppingNotConsumed );
                        if( iViewUtility &&
                            ( iViewUtility->ActiveViewImplementationUid() != KNullUid ) )
                            {
                            TInt viewId( iViewUtility->ActiveViewType().iUid );
                            TBuf8<KMVPrefixLen + KMaxIntLen> buf;
                            buf.Copy( KMVPrefix );
                            buf.AppendNum( viewId );
                            statusInfo = iBackSteppingUtility->HandleBackCommandL( buf );
                            MPX_DEBUG3("CMPXCollectionViewHgImp::HandleCommandL - viewid=0x%x, statusInfo=%d",
                                 viewId, statusInfo );
                            }
                        if ( statusInfo == KMPXBackSteppingNotConsumed )
                            // event not consumed by Back Stepping utility, handle here
                            //
                            {
                            AppUi()->HandleCommandL( aCommand );
                            }
                        }
                    else
                        {
                        if ( currentDepth > 2 && !iBackOneLevel )
                            {
                            iContainer->ClearLbxSelection();
                            iCollectionUtility->Collection().BackL();
                            iFirstIncrementalBatch = ETrue;
                            MPX_DEBUG2( "CMPXCollectionViewHgImp::HandleCommandL Getting container media, currentDepth = %d", currentDepth );
                            cpath->Back();
                            cpath->Back();
                            RArray<TMPXAttribute> attrs;
                            CleanupClosePushL(attrs);
                            iCurrentMediaLOp = EMPXOpMediaLGetContainerInfo;
                            attrs.Append( KMPXMediaGeneralDuration );
                            iCollectionUtility->Collection().MediaL( *cpath, attrs.Array() );
                            CleanupStack::PopAndDestroy( &attrs );
                            iBackOneLevel = ETrue;
                            }
                        else
                            {
                            MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleCommandL Not getting container media" );
                            }

                        iHandlingKeyEvent = ETrue;
                        }
                    CleanupStack::PopAndDestroy( cpath );
                    }
                else
                    {
                    MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleCommandL Busy, ignoring command" );
                    }
                }
            break;
            }
        case EMPXCmdSavePlaylist:
            {
            AppUi()->HandleCommandL( EMPXCmdSaveAndReopen );
            break;
            }
        case EAknCmdExit:
        case EAknSoftkeyExit:
            {
            AppUi()->HandleCommandL( aCommand );
            break;
            }
        case EMPXCmdCancelReorder:
            {
            if ( iContainer && iContainer->IsInReorderMode() )
                {
                TRAP_IGNORE( ProcessCommandL( EMPXCmdReorderCancel ) );
                iCurrentHighlightedIndex = KErrNotFound;
                }
            break;
            }
        case EMPXCmdUpnpPlayViaLocal:
            {
            if ( iUpnpFrameworkSupport )
                {
                SelectNewPlayerL( aCommand );
                }
            break;
            }
        case EMPXCmdUPnPAiwCmdCopyToExternalCriteria:
            {
            if ( iUpnpFrameworkSupport )
                {
                CopySelectedItemsToRemoteL();
                }
            break;
            }

        case EMPXCmdPlay:
        case EMPXCmdForcePlay:
        case EMPXCmdPlayPause:
            {
            TBool isReady( ETrue );
            TMPXPlaybackState state( iPlaybackUtility->StateL() );

            // if it's in paused state, resume playback, no need
            // to check if current highlight is a playlist
            if ( iContainer &&
                aCommand != EMPXCmdForcePlay &&
                state != EPbStatePaused && state != EPbStatePlaying )
                {
                CMPXCommonListBoxArrayBase* listboxArray =
                    iContainer->ListBoxArray();
                if ( iContainer->CurrentListItemCount() > 0 )
                    {
                    TInt currentItem(
                        iContainer->CurrentLbxItemIndex() );
                    const CMPXMedia& media = listboxArray->MediaL( currentItem );
                    TMPXGeneralType type(
                        media.ValueTObjectL<TMPXGeneralType>( KMPXMediaGeneralType ) );
                    TMPXGeneralCategory category(
                        media.ValueTObjectL<TMPXGeneralCategory>( KMPXMediaGeneralCategory ) );
                    if ( category == EMPXPlaylist && type == EMPXItem )
                        {
                        MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleCommandL checking item count in playlist" );
                        isReady = EFalse;
                        TMPXItemId id(
                            media.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) );
                        CMPXMedia* entry = CMPXMedia::NewL();
                        CleanupStack::PushL( entry );
                        entry->SetTObjectValueL<TMPXGeneralType>(
                            KMPXMediaGeneralType, EMPXGroup );
                        entry->SetTObjectValueL<TMPXGeneralCategory>(
                            KMPXMediaGeneralCategory, EMPXSong );
                        entry->SetTObjectValueL<TMPXItemId>(
                            KMPXMediaGeneralId, id );
                        iCurrentFindAllLOp = EMPXOpFindAllLPlaylistTracksCount;
                        RArray<TMPXAttribute> attrs;
                        CleanupClosePushL( attrs );
                        attrs.Append( KMPXMediaGeneralId );
                        iCollectionUtility->Collection().FindAllL(
                            *entry, attrs.Array(), *this );
                        CleanupStack::PopAndDestroy( &attrs );
                        CleanupStack::PopAndDestroy( entry );
                        }
                    }
                else
                    {
                    // current list view is empty, and no song currently playing
                    // ignore the command
                    isReady = EFalse;
                    }
                }
            if ( isReady )
                {
                if ( aCommand == EMPXCmdForcePlay )
                    {
                    aCommand = EMPXCmdPlay;
                    }
                if ( EPbStateNotInitialised == state ||
                     EPbStateStopped == state )
                    {
                    // Needed to reset the status of iPreservedState
                    if ( EPbStateStopped == state )
                        {
                        iPlaybackUtility->CommandL(EPbCmdResetPreserveState);
                        }
                    TInt currentItem(
                        iContainer->CurrentLbxItemIndex() );
                    MPX_DEBUG2( "CMPXCollectionViewHgImp::HandleCommandL playing index %d", currentItem );
                    if ( iContainer->IsInReorderMode() )
                        {
                        // if in reorder mode, and in not playing state
                        // drop the reorder target and start playing
                        if ( iIsGrabbed )
                            {
                            ProcessCommandL( EMPXCmdReorderDrop );
                            }
                        ProcessCommandL( EMPXCmdReorderDone );
                        iPlayIndex = currentItem;
                        }
                    else if ( currentItem != KErrNotFound )
                        {
                        if ( iContainer && !AppUi()->IsDisplayingDialog() )
                            {
                            StopDisplayingMenuBar();
                            }
                        iPlayIndex = KErrNotFound;

                        if (iContainer->IsSelectedItemASong())
							{
							if(iCollectionCacheReady)
								{
								iCollectionUtility->Collection().OpenL( currentItem, EMPXOpenPlaylistOnly );
								iFirstIncrementalBatch = ETrue;
								}
							}
						else
							{
							iContainer->HandleItemCommandL(EMPXCmdPlay);
							}

                        }
                    }
                else
                    {
                    AppUi()->HandleCommandL( aCommand );
                    }
                }
            break;
            }
        case EMPXCmdSaveComplete:
            {
            MPXTlsHelper::SetNeedSave( EFalse );
            break;
            }
#ifdef __ENABLE_PODCAST_IN_MUSIC_MENU
        case EMPXCmdRefreshLibrary:
            {
            MPX_PERF_CHECKPT("Refresh collection library");
            // Package the argument from 8bit to 16bit then activate view
            //
            StartWaitNoteL( EMPXRefreshingNote );
            iPlaybackUtility->CommandL( EPbCmdStop );
            break;
            }
#endif
        default:
            {
            MPX_PERF_CHECKPT("Handle Collection view unknown command");
            if ( iUpnpFrameworkSupport )
                {
                if ( aCommand >= EMPXCmdUpnpPlayViaRemotePlayer  &&
                     aCommand < EMPXCmdUpnpLastCommandId )
                    {
                    SelectNewPlayerL( aCommand );
                    }
                else
                    {
                    if ( iServiceHandler->ServiceCmdByMenuCmd(aCommand) != KAiwCmdNone )
                        {
                        CAiwGenericParamList& paramList = iServiceHandler->InParamListL();
                        FillAiwParametersL(paramList);
                        iServiceHandler->ExecuteMenuCmdL(aCommand, paramList,
                            iServiceHandler->OutParamListL());
                        }
                    AppUi()->HandleCommandL( aCommand );
                    }
                }
            else
                {
                if ( iServiceHandler->ServiceCmdByMenuCmd(aCommand) != KAiwCmdNone )
                    {
                    CAiwGenericParamList& paramList = iServiceHandler->InParamListL();
                    FillAiwParametersL(paramList);
                    iServiceHandler->ExecuteMenuCmdL(aCommand, paramList,
                        iServiceHandler->OutParamListL());
                    }
                AppUi()->HandleCommandL( aCommand );
                }
            break;
            }
        }
    MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleCommandL() exiting" );
    }

// ---------------------------------------------------------------------------
// From CAknView
// Handles a view activation.
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::DoActivateL(
    const TVwsViewId& /* aPrevViewId */,
    TUid /* aCustomMessageId */,
    const TDesC8& /* aCustomMessage */ )
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::DoActivateL()" );

    // Add view deactivation observer
    AppUi()->AddViewDeactivationObserverL( this );

    // Set status pane layout if switched here directly from another view,
    // such as when using the AnyKey
    StatusPane()->MakeVisible( ETrue );
    StatusPane()->SwitchLayoutL(R_AVKON_STATUS_PANE_LAYOUT_USUAL_FLAT);

    if ( !iContainer )
        {
        iContainer = CMPXCollectionViewHgContainer::NewL( this, this, iIsEmbedded );
        iContainer->SetCbaHandler( this );
        }
    iContainer->SetMopParent( this );
    AppUi()->AddToStackL( *this, iContainer );
    iContainer->SetRect( ClientRect() );

    CMPXCollectionPath* cpath( iCollectionUtility->Collection().PathL() );
    CleanupStack::PushL( cpath );

#ifdef __ENABLE_PODCAST_IN_MUSIC_MENU
    // media is not valid until the first HandleOpenL call
    CEikButtonGroupContainer* cba = Cba();
    if ( cba )
        {
        cba->SetCommandSetL(
            ( cpath->Levels() == 2 && !iIsEmbedded ) ?
            R_MPX_OPTIONS_BACK_CBA_NO_ACTION : R_MPX_OPTIONS_BACK_CBA_NO_ACTION );
        cba->DrawDeferred();
        }
#else
    // media is not valid until the first HandleOpenL call
    CEikButtonGroupContainer* cba = Cba();
    if ( cba )
        {
        cba->SetCommandSetL(
            ( iViewUtility->ViewHistoryDepth() == 1 && !iIsEmbedded ) ?
            R_MPX_OPTIONS_EXIT_CBA_NO_ACTION : R_MPX_OPTIONS_BACK_CBA_NO_ACTION );
        cba->DrawDeferred();
        }
#endif

	UpdateTitlePaneL();
    UpdateNaviPaneL();


    if ( iViewUtility->PreviousViewType().iUid == KMPXPluginTypePlaybackUid )
        {
#ifdef __ENABLE_PODCAST_IN_MUSIC_MENU
        // If previous view is Playback view, it can only be normal playback view
        // Podcast shouldn't be highlighted in any case.
        iPodcast = EFalse;
#endif

        // return back from playback view and in songs level,
        // highlight the new playing song
        MMPXSource* source( iPlaybackUtility->Source() );

        if ( source )
            {
            CMPXCollectionPlaylist* playlist( source->PlaylistL() );
            if ( playlist )
                {
                // Going from Now Playing View -> Collection, same collection level
                iPossibleJump = ( playlist->Path().Levels() == cpath->Levels() );
                delete playlist;
                }
            }

        if ( cpath->Levels() > 1 )
            {
            // valid path in collection
            GetDurationL();
            MPX_DEBUG_PATH(*cpath);

            DoIncrementalOpenL();
            }
        else
            {
            TUid defaultView( iViewUtility->DefaultViewUid() );
            iViewUtility->ActivateViewL( ( defaultView != KNullUid ) ?
                defaultView : TUid::Uid( KMPXPluginTypeMainUid ) );
            }
        }
    else
        {
#ifdef __ENABLE_PODCAST_IN_MUSIC_MENU
        // If previous view is Collection view, it can only be podcast view
        if ( iViewUtility->PreviousViewType().iUid == KMPXPluginTypeCollectionUid )
            {
            iPodcast = ETrue;
            }
        // don't bother getting duration if at plugin list
        if ( cpath->Levels() > 1 )
#endif
            {
            GetDurationL();
            }
        MPX_DEBUG_PATH(*cpath);

        DoIncrementalOpenL( cpath->Levels()>KMusicCollectionMenuLevel ? ETrue:EFalse );

        iUpCount = 0;
        iDownCount = 0;
        }
    CleanupStack::PopAndDestroy( cpath );
    }

// ---------------------------------------------------------------------------
// From CAknView
// View deactivation function.
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::DoDeactivate()
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::DoDeactivate" );
    if ( iContainer && iContainer->IsInReorderMode() )
        {
        TRAP_IGNORE( ProcessCommandL( EMPXCmdReorderDone ) );
        iCurrentHighlightedIndex = KErrNotFound;
        }

    if ( iContainer )
        {
        iContainer->ContentIsReady( EFalse );
        AppUi()->RemoveFromStack( iContainer );
        delete iContainer;
        iContainer = NULL;
        }

    if (iDuration)
        {
        delete iDuration;
        iDuration = NULL;
        TRAP_IGNORE(UpdateNaviPaneL());
        }

    // Cleanup view deactivation observer
    AppUi()->RemoveViewDeactivationObserver( this );
    }

// ---------------------------------------------------------------------------
// From CAknView
// Foreground event handling function.
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::HandleForegroundEventL( TBool aForeground )
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::HandleForegroundEventL" );
    if ( aForeground && iOpeningNote )
    	{
        CloseWaitNoteL();
        iOpeningNote = EFalse;
    	}
    iActivateBackStepping = EFalse;
    MPX_DEBUG3("CMPXCollectionViewHgImp::HandleForegroundEventL - is in foreground=%d, this view=0x%x",
        aForeground, Id().iUid );
    if( aForeground &&
        iViewUtility &&
        ( iViewUtility->ActiveViewImplementationUid() != KNullUid ) )
        {
        iActivateBackStepping = ETrue;
        }
        {
        CAknView::HandleForegroundEventL( aForeground );
        }
    }

// -----------------------------------------------------------------------------
// CMPXCollectionViewHgImp::HandleBacksteppingActivation
// Handle backstepping activation
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::HandleBacksteppingActivation()
    {
    TInt viewId( iViewUtility->ActiveViewType().iUid );
    TBuf8<KMVPrefixLen + KMaxIntLen> buf;
    buf.Copy( KMVPrefix );
    buf.AppendNum( viewId );
    TInt statusInfo( KMPXBackSteppingNotConsumed );
    TRAP_IGNORE(
       statusInfo =
        iBackSteppingUtility->ForwardActivationEventL( buf, ETrue );
         );
    MPX_DEBUG3("CMPXCollectionViewHgImp::HandleBacksteppingActivation - viewId=0x%x, statusInfo=%d", viewId, statusInfo );
    iActivateBackStepping = EFalse;
   }

// ---------------------------------------------------------------------------
// Handle initialing a music menu pane.
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::HandleInitMusicMenuPaneL(
    CEikMenuPane* aMenuPane )
    {
    CMPXCollectionViewListBoxArray* array =
        static_cast<CMPXCollectionViewListBoxArray*>(
        iContainer->ListBoxArray() );
	const CMPXMedia& containerMedia = array->ContainerMedia();

	TMPXGeneralCategory containerCategory(
		containerMedia.ValueTObjectL<TMPXGeneralCategory>(
			KMPXMediaGeneralCategory ) );

	switch ( containerCategory )
		{
		case EMPXPlaylist:
			{
			// playlist view
			aMenuPane->SetItemDimmed( EMPXCmdGoToPlaylists, ETrue );
			aMenuPane->SetItemDimmed( EMPXCmdGoToGenre, ETrue );
			aMenuPane->SetItemDimmed( EMPXCmdRefreshLibrary, ETrue );
			break;
			}
		case EMPXAlbum:
		case EMPXArtist:
			{
			// Artists & Albums view
			aMenuPane->SetItemDimmed( EMPXCmdGoToArtistAlbums, ETrue );
			aMenuPane->SetItemDimmed( EMPXCmdGoToGenre, ETrue );
			break;
			}
		case EMPXGenre:
			{
			// Genre view
			aMenuPane->SetItemDimmed( EMPXCmdGoToGenre, ETrue );
			aMenuPane->SetItemDimmed( EMPXCmdRefreshLibrary, ETrue );
			break;
			}
		case EMPXSong:
			{
			aMenuPane->SetItemDimmed( EMPXCmdGoToAllSongs, ETrue );
			aMenuPane->SetItemDimmed( EMPXCmdRefreshLibrary, ETrue );
			break;
			}
		default:
			{
			break;
			}
		}
   	}
// ---------------------------------------------------------------------------
// From MEikMenuObserver
// Dynamically initialises a menu pane.
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::DynInitMenuPaneL(
    TInt aResourceId,
    CEikMenuPane* aMenuPane )
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::DynInitMenuPaneL" );
    CMPXCollectionViewListBoxArray* array =
        static_cast<CMPXCollectionViewListBoxArray*>(
        iContainer->ListBoxArray() );
    TInt currentItem( iContainer->CurrentLbxItemIndex() );
    TBool isListEmpty( currentItem < 0 );
    TInt selectionCount( 0 );
	
    iSelectionIndexCache = iContainer->CurrentSelectionIndicesL(); // not owned
    if ( iSelectionIndexCache)
        {
        selectionCount = iSelectionIndexCache->Count();
        }

    TInt usbUnblockingStatus;
    RProperty::Get( KMPXViewPSUid,
                    KMPXUSBUnblockingPSStatus,
                    usbUnblockingStatus);

    switch ( aResourceId )
        {
        case R_MPX_COLLECTION_VIEW_MENU_1:
            {
            const CMPXMedia& containerMedia = array->ContainerMedia();
            TMPXGeneralType containerType(
                containerMedia.ValueTObjectL<TMPXGeneralType>( KMPXMediaGeneralType ) );
            TMPXGeneralCategory containerCategory(
                containerMedia.ValueTObjectL<TMPXGeneralCategory>(
                    KMPXMediaGeneralCategory ) );

            HandleInitMusicMenuPaneL(aMenuPane);

            MPX_DEBUG3( "CMPXCollectionViewHgImp::DynInitMenuPaneL container type = %d, category = %d", containerType, containerCategory );

            // Always dim the find in hg implementation
            aMenuPane->SetItemDimmed( EMPXCmdFind, ETrue );

			// Determine if we should hide "Goto now playing" option.
            TBool hideNowPlaying(EFalse);
			MMPXSource* source( iPlaybackUtility->Source() );
            if ( source == 0 )
				{
				MMPXPlaybackUtility* pdPlaybackUtility;
				pdPlaybackUtility = MMPXPlaybackUtility::UtilityL( TUid::Uid( KProgressDownloadUid ) );
				hideNowPlaying = pdPlaybackUtility->Source() ? EFalse : ETrue;
				pdPlaybackUtility->Close();
				}
            if (usbUnblockingStatus == EMPXUSBUnblockingPSStatusActive)
                {
                aMenuPane->SetItemDimmed( EMPXCmdRefreshLibrary, ETrue );
                }

			aMenuPane->SetItemDimmed( EMPXCmdGoToNowPlaying, hideNowPlaying );

            if ( !isListEmpty )
                {
                const CMPXMedia& media = array->MediaL( currentItem );
                TMPXGeneralType type(
                    media.ValueTObjectL<TMPXGeneralType>( KMPXMediaGeneralType ) );
                TMPXGeneralCategory category(
                    media.ValueTObjectL<TMPXGeneralCategory>(
                        KMPXMediaGeneralCategory ) );
                MPX_DEBUG3( "CMPXCollectionViewHgImp::DynInitMenuPaneL item type = %d, category = %d", type, category );
#ifdef SINGLE_CLICK_INCLUDED
                if ( containerType == EMPXGroup && containerCategory == EMPXAlbum )
                    {
                    // Artists & Albums view
                    switch ( category )
                        {
                        case EMPXAlbum:
                            {
                            TBool landscapeOrientation = Layout_Meta_Data::IsLandscapeOrientation();
                            if ( landscapeOrientation )
                                {
                                aMenuPane->SetItemDimmed( EMPXCmdCreatePlaylist, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdAddToPlaylist, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdSend, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdDelete, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdPlayItem, ETrue );                            
                                }
                            else
                                {
                                if ( usbUnblockingStatus == EMPXUSBUnblockingPSStatusActive )
                                    {
                                    aMenuPane->SetItemDimmed( EMPXCmdCreatePlaylist, ETrue );
                                    aMenuPane->SetItemDimmed( EMPXCmdAddToPlaylist, ETrue );
                                    aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
                                    aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
                                    aMenuPane->SetItemDimmed( EMPXCmdSend, ETrue );
                                    aMenuPane->SetItemDimmed( EMPXCmdDelete, ETrue );
                                    aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue );
                                    aMenuPane->SetItemDimmed( EMPXCmdPlayItem, EFalse );
                                    }
                                else
                                    {
                                    aMenuPane->SetItemDimmed( EMPXCmdCreatePlaylist, ETrue );
                                    aMenuPane->SetItemDimmed( EMPXCmdAddToPlaylist, EFalse );
                                    aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
                                    aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
                                    aMenuPane->SetItemDimmed( EMPXCmdSend, ETrue );
                                    aMenuPane->SetItemDimmed( EMPXCmdDelete, EFalse );
                                    aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue );
                                    aMenuPane->SetItemDimmed( EMPXCmdPlayItem, EFalse );
                                    }
                                }
                            break;
                            }
                        case EMPXCommand:
                            {
                            aMenuPane->SetItemDimmed( EMPXCmdCreatePlaylist, ETrue );
                            aMenuPane->SetItemDimmed( EMPXCmdAddToPlaylist, ETrue );
                            aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
                            aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
                            aMenuPane->SetItemDimmed( EMPXCmdSend, ETrue );
                            aMenuPane->SetItemDimmed( EMPXCmdDelete, ETrue );
                            aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue );
                            aMenuPane->SetItemDimmed( EMPXCmdPlayItem, ETrue );
                            break;
                            }
                        }
                    }
                else
#endif
                if ( containerType == EMPXItem && containerCategory == EMPXPlaylist )
                    {
                    // in playlist tracks view
                    // enable reordering and add songs in playlist view
                    aMenuPane->SetItemDimmed( EMPXCmdCreatePlaylist, ETrue );
                    aMenuPane->SetItemDimmed( EMPXCmdAddToPlaylist, ETrue );
                    if ( usbUnblockingStatus == EMPXUSBUnblockingPSStatusActive )
                        {
                        aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
                        aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
                        aMenuPane->SetItemDimmed( EMPXCmdSend, SendOptionVisibilityL() );
                        aMenuPane->SetItemDimmed( EMPXCmdDelete, ETrue );
                        aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue );
#ifdef SINGLE_CLICK_INCLUDED
                        aMenuPane->SetItemDimmed( EMPXCmdPlayItem, ETrue );
#endif

                        }
                    else
                        {
                        // do not display add songs option when marking is on
                        aMenuPane->SetItemDimmed( EMPXCmdAddSongs, selectionCount > 0 );
                        TInt totalItemCount( iContainer->TotalListItemCount() );
                        // display reorder option only when more than 1 item is visible
                        // do not display reorder option when marking is on
#ifdef SINGLE_CLICK_INCLUDED
                        aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
#else
                        aMenuPane->SetItemDimmed( EMPXCmdReorder,
                            ( totalItemCount > 1 && selectionCount == 0 ) ?
                            EFalse : ETrue );
#endif
                        aMenuPane->SetItemDimmed( EMPXCmdSend, SendOptionVisibilityL() );
                        aMenuPane->SetItemDimmed( EMPXCmdDelete, ETrue );
                        aMenuPane->SetItemDimmed( EMPXCmdRemove, EFalse );
#ifdef SINGLE_CLICK_INCLUDED
                        aMenuPane->SetItemDimmed( EMPXCmdPlayItem, ETrue );
#endif
						}

                    if ( containerMedia.IsSupported(
                        KMPXMediaGeneralNonPermissibleActions ) )
                        {
                        // check for auto playlist, disable add, remove and reorder
                        TMPXGeneralNonPermissibleActions attr(
                            containerMedia.ValueTObjectL<TMPXGeneralNonPermissibleActions>(
                                KMPXMediaGeneralNonPermissibleActions ) );
                        if ( attr & EMPXWrite )
                            {
                            aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
                            aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
                            aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue );
                            }
                        }
                    }
                else if ( type == EMPXItem )
                    {
                    switch ( category )
                        {
                        case EMPXPlaylist:
                            {
                            // playlist view
                            if ( usbUnblockingStatus == EMPXUSBUnblockingPSStatusActive )
                                {
                                aMenuPane->SetItemDimmed( EMPXCmdCreatePlaylist, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdAddToPlaylist, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdSend, SendOptionVisibilityL() );
                                aMenuPane->SetItemDimmed( EMPXCmdDelete, ETrue );
                                }
                            else
                                {
                                aMenuPane->SetItemDimmed( EMPXCmdCreatePlaylist, EFalse );
                                aMenuPane->SetItemDimmed( EMPXCmdAddToPlaylist, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdSend, SendOptionVisibilityL() );
                                aMenuPane->SetItemDimmed( EMPXCmdDelete, EFalse );
                                }
                            if ( media.IsSupported(
                                KMPXMediaGeneralNonPermissibleActions ) )
                                {
                                // check for auto playlist, disable delete
                                TMPXGeneralNonPermissibleActions attr(
                                    media.ValueTObjectL<TMPXGeneralNonPermissibleActions>(
                                        KMPXMediaGeneralNonPermissibleActions ) );
                                if ( attr & EMPXWrite )
                                    {
                                    aMenuPane->SetItemDimmed( EMPXCmdDelete, ETrue );
                                    }
                                }
                            aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue );
                            TInt trackCount (0);                   
                            if(media.IsSupported(KMPXMediaGeneralCount))
                                {
                                trackCount = media.ValueTObjectL<TInt>( KMPXMediaGeneralCount );
                                } 
                            if( trackCount < 1 )
                                {
                                aMenuPane->SetItemDimmed( EMPXCmdPlayItem, ETrue );
                                }   
                            break;
                            }
#ifdef SINGLE_CLICK_INCLUDED
                        case EMPXAlbum:
                            {
                            // Album > Tracks view
                            if ( iContainer->IsSelectedItemASong() )
                                {                            
                                if ( usbUnblockingStatus == EMPXUSBUnblockingPSStatusActive )
                                    {
                                    aMenuPane->SetItemDimmed( EMPXCmdCreatePlaylist, ETrue );
                                    aMenuPane->SetItemDimmed( EMPXCmdAddToPlaylist, ETrue );
                                    aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
                                    aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
                                    aMenuPane->SetItemDimmed( EMPXCmdSend, SendOptionVisibilityL() );
                                    aMenuPane->SetItemDimmed( EMPXCmdDelete, ETrue );
                                    aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue );
                                    aMenuPane->SetItemDimmed( EMPXCmdPlayItem, ETrue );
                                    }
                                else
                                    {
                                    aMenuPane->SetItemDimmed( EMPXCmdCreatePlaylist, ETrue );
                                    aMenuPane->SetItemDimmed( EMPXCmdAddToPlaylist, EFalse );
                                    aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
                                    aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
                                    aMenuPane->SetItemDimmed( EMPXCmdSend, SendOptionVisibilityL() );
                                    aMenuPane->SetItemDimmed( EMPXCmdDelete, EFalse );
                                    aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue );
                                    aMenuPane->SetItemDimmed( EMPXCmdPlayItem, ETrue );
                                    }
                                }
                            else
                                {
                                aMenuPane->SetItemDimmed( EMPXCmdCreatePlaylist, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdAddToPlaylist, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdSend, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdDelete, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdPlayItem, ETrue );                                
                                }
                            break;
                            }
                        case EMPXGenre:
                            {
                            // genre view
                            if ( usbUnblockingStatus == EMPXUSBUnblockingPSStatusActive )
                                {
                                aMenuPane->SetItemDimmed( EMPXCmdCreatePlaylist, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdAddToPlaylist, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdSend, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdDelete, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue );
                                }
                            else
                                {
                                aMenuPane->SetItemDimmed( EMPXCmdCreatePlaylist, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdAddToPlaylist, EFalse );
                                aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdSend, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdDelete, EFalse );
                                aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue );
                                }
                            break;
                            }
#endif
                            
#ifdef SINGLE_CLICK_INCLUDED
                        case EMPXArtist:  
                        case EMPXComposer:
#else
                        case EMPXAlbum:
                        case EMPXArtist:
                        case EMPXGenre:
                        case EMPXComposer:
#endif
                            {
                            // artist, album, genre, composer view
                            if ( usbUnblockingStatus == EMPXUSBUnblockingPSStatusActive )
                                {
                                aMenuPane->SetItemDimmed( EMPXCmdCreatePlaylist, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdAddToPlaylist, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdSend, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdDelete, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue );
                                }
                            else
                                {
                                aMenuPane->SetItemDimmed( EMPXCmdCreatePlaylist, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdAddToPlaylist, EFalse );
                                aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdSend, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdDelete, EFalse );
                                aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue );
                                }
                            break;
                            }
                        case EMPXSong:
                            {
                            // any tracks view except playlist tracks
                            if ( usbUnblockingStatus == EMPXUSBUnblockingPSStatusActive )
                                {
                                aMenuPane->SetItemDimmed( EMPXCmdCreatePlaylist, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdAddToPlaylist, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdSend, SendOptionVisibilityL() );
                                aMenuPane->SetItemDimmed( EMPXCmdDelete, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue );
#ifdef SINGLE_CLICK_INCLUDED
                                aMenuPane->SetItemDimmed( EMPXCmdPlayItem, ETrue );
#endif
                                }
                            else
                                {
                                aMenuPane->SetItemDimmed( EMPXCmdCreatePlaylist, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdAddToPlaylist, EFalse );
                                aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdSend, SendOptionVisibilityL() );
                                aMenuPane->SetItemDimmed( EMPXCmdDelete, EFalse );
                                aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue );
#ifdef SINGLE_CLICK_INCLUDED
                                aMenuPane->SetItemDimmed( EMPXCmdPlayItem, ETrue );
#endif
                                }
                            break;
                            }
                        case EMPXCommand:
                            {
							aMenuPane->SetItemDimmed( EMPXCmdCreatePlaylist, ETrue );
							aMenuPane->SetItemDimmed( EMPXCmdAddToPlaylist, ETrue );
							aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
							aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
							aMenuPane->SetItemDimmed( EMPXCmdSend, ETrue );
							aMenuPane->SetItemDimmed( EMPXCmdDelete, ETrue );
							aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue );
#ifdef SINGLE_CLICK_INCLUDED
                            aMenuPane->SetItemDimmed( EMPXCmdPlayItem, ETrue );
#endif
							
                            }
                            break;
                        default:
                            {
                            ASSERT( 0 );
                            break;
                            }
                        }
                    }

                if ( iUpnpFrameworkSupport )
                    {
                    HandleDynInitUpnpL( aResourceId, *aMenuPane );
                    }
                else
                    {
                    aMenuPane->SetItemDimmed( EMPXCmdUpnpPlayVia, ETrue );
                    aMenuPane->SetItemDimmed( EMPXCmdUPnPAiwCmdCopyToExternalCriteria, ETrue );
                    }
                }
            else
                {
                // list empty

                aMenuPane->SetItemDimmed( EMPXCmdCreatePlaylist,
                    ( containerType == EMPXGroup && containerCategory == EMPXPlaylist) ? // in playlist view?
                    EFalse : ETrue );
                if ( containerType == EMPXItem && containerCategory == EMPXPlaylist)
                    {
                    // in playlist tracks view
                    if ( containerMedia.IsSupported(
                        KMPXMediaGeneralNonPermissibleActions ) )
                        {
                        // check for auto playlist, disable add songs
                        TMPXGeneralNonPermissibleActions attr(
                            containerMedia.ValueTObjectL<TMPXGeneralNonPermissibleActions>(
                                KMPXMediaGeneralNonPermissibleActions ) );
                        if ( attr & EMPXWrite )
                            {
                            aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
                            }
                        }
                    }
                else
                    {
                    aMenuPane->SetItemDimmed( EMPXCmdAddSongs, ETrue );
                    }
                aMenuPane->SetItemDimmed( EMPXCmdUpnpPlayVia, ETrue );
                aMenuPane->SetItemDimmed( EMPXCmdUPnPAiwCmdCopyToExternalCriteria, ETrue );
                aMenuPane->SetItemDimmed( EMPXCmdAddToPlaylist, ETrue );
                aMenuPane->SetItemDimmed( EMPXCmdReorder, ETrue );
                aMenuPane->SetItemDimmed( EMPXCmdSend, ETrue );
                aMenuPane->SetItemDimmed( EMPXCmdDelete, ETrue );
                aMenuPane->SetItemDimmed( EMPXCmdRemove, ETrue );
                }
            break;
            }
        case R_MPX_COLLECTION_VIEW_MENU_2:
            {
            if ( !isListEmpty )
                {
                const CMPXMedia& media = array->MediaL( currentItem );
                TMPXGeneralType type(
                    media.ValueTObjectL<TMPXGeneralType>( KMPXMediaGeneralType ) );
                TMPXGeneralCategory category(
                    media.ValueTObjectL<TMPXGeneralCategory>(
                        KMPXMediaGeneralCategory ) );
                const CMPXMedia& containerMedia = array->ContainerMedia();
                TMPXGeneralType containerType(
                    containerMedia.ValueTObjectL<TMPXGeneralType>(
                        KMPXMediaGeneralType ) );
                TMPXGeneralCategory containerCategory(
                    containerMedia.ValueTObjectL<TMPXGeneralCategory>(
                        KMPXMediaGeneralCategory ) );
                MPX_DEBUG3( "CMPXCollectionViewHgImp::DynInitMenuPaneL container type = %d, category = %d", containerType, containerCategory );
                MPX_DEBUG3( "CMPXCollectionViewHgImp::DynInitMenuPaneL item type = %d, category = %d", type, category );
                if ( type == EMPXItem)
                    {
                    switch ( category )
                        {
                        case EMPXPlaylist:
                            {
                            // playlist view
                            aMenuPane->SetItemDimmed( EMPXCmdUseAsCascade, ETrue );
                            aMenuPane->SetItemDimmed( EMPXCmdSongDetails, ETrue );
                            if ( usbUnblockingStatus == EMPXUSBUnblockingPSStatusActive )
                                {
                                aMenuPane->SetItemDimmed( EMPXCmdRename, ETrue );
                                }
                            else
                                {
                                aMenuPane->SetItemDimmed( EMPXCmdRename, EFalse );
                                }
                            aMenuPane->SetItemDimmed( EMPXCmdAlbumArt, ETrue );
                            aMenuPane->SetItemDimmed( EMPXCmdFindInMusicShop, ETrue );
                            aMenuPane->SetItemDimmed( EMPXCmdPlaylistDetails, EFalse );
                            if ( media.IsSupported(
                                KMPXMediaGeneralNonPermissibleActions ) )
                                {
                                // check for auto playlist, disable delete
                                TMPXGeneralNonPermissibleActions attr(
                                    media.ValueTObjectL<TMPXGeneralNonPermissibleActions>(
                                        KMPXMediaGeneralNonPermissibleActions ) );
                                if ( attr & EMPXWrite )
                                    {
                                    aMenuPane->SetItemDimmed( EMPXCmdRename, ETrue );
                                    aMenuPane->SetItemDimmed( EMPXCmdPlaylistDetails, ETrue );
                                    }
                                }
                            if ( array->IsItemBrokenLinkL( currentItem ) ||
                                array->IsItemCorruptedL( currentItem ) )
                                {
                                aMenuPane->SetItemDimmed( EMPXCmdRename, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdPlaylistDetails, ETrue );
                                }
                            break;
                            }
                        case EMPXAlbum:
                        case EMPXArtist:
                        case EMPXGenre:
                        case EMPXComposer:
                            {
                            // artist, album, genre, composer view
                            aMenuPane->SetItemDimmed( EMPXCmdUseAsCascade, ETrue );
                            aMenuPane->SetItemDimmed( EMPXCmdSongDetails, ETrue );
                            if ( usbUnblockingStatus == EMPXUSBUnblockingPSStatusActive )
                                {
                                aMenuPane->SetItemDimmed( EMPXCmdRename, ETrue );
                                }
                            else
                                {
#ifdef SINGLE_CLICK_INCLUDED
                                aMenuPane->SetItemDimmed( EMPXCmdRename, ETrue );
#else
                                aMenuPane->SetItemDimmed( EMPXCmdRename, EFalse );                              
#endif
                                }
#ifndef SINGLE_CLICK_INCLUDED
                            if ( category == EMPXAlbum )
                                {
                                aMenuPane->SetItemDimmed( EMPXCmdAlbumArt, EFalse );
                                // if unknown entry exist in album level, disable album art
                                // for last item, if unknown exist it'll be at this
                                // location
                                if ( array->IsCategoryUnknownExist() &&
                                    category == EMPXAlbum &&
                                    currentItem == iContainer->TotalListItemCount() - 1 )
                                    {
                                    aMenuPane->SetItemDimmed( EMPXCmdAlbumArt, ETrue );
                                    }
                                if ( containerCategory == EMPXArtist )
                                    {
                                    // in artist/album view, do not display album art/rename
                                    // option on All ( first item in list )
                                    if ( currentItem == 0 )
                                        {
                                        aMenuPane->SetItemDimmed( EMPXCmdRename, ETrue );
                                        aMenuPane->SetItemDimmed( EMPXCmdAlbumArt, ETrue );
                                        }
                                    }
                                }
                            else
#endif
                                {
                                aMenuPane->SetItemDimmed( EMPXCmdAlbumArt, ETrue );
                                }
#ifdef SINGLE_CLICK_INCLUDED
                            if ( category == EMPXComposer )
#else
                            if ( ( category == EMPXGenre ) || ( category == EMPXComposer ) )
#endif
                                {
                                aMenuPane->SetItemDimmed( EMPXCmdFindInMusicShop, ETrue );
                                }
#ifdef SINGLE_CLICK_INCLUDED
                            else if ( category == EMPXGenre )
                                {
                                aMenuPane->SetItemDimmed( EMPXCmdFindInMusicShop, EFalse );
                                }
#endif
                            else
                                {
                                if ( array->IsCategoryUnknownExist() &&
                                    ( category == EMPXAlbum || category == EMPXArtist ) &&
                                    currentItem == iContainer->TotalListItemCount() - 1 )
                                    {
                                    // if unknown entry exist in artist or album level
                                    aMenuPane->SetItemDimmed( EMPXCmdFindInMusicShop, ETrue );
                                    }
                                else
                                    {
#ifdef SINGLE_CLICK_INCLUDED
                                    aMenuPane->SetItemDimmed( EMPXCmdFindInMusicShop, ETrue );
#else
                                    aMenuPane->SetItemDimmed( EMPXCmdFindInMusicShop, EFalse );
#endif
                                    }
                                }
                            aMenuPane->SetItemDimmed( EMPXCmdPlaylistDetails, ETrue );

                            if ( !iUsingNokiaService )
                                {
                                aMenuPane->SetItemDimmed( EMPXCmdFindInMusicShop, ETrue );
                                }
                            break;
                            }
                        case EMPXSong:
                            {
                            // any tracks view
#ifdef __ENABLE_MSK
                            // show context menu if MSK selected and there are
                            // multiple selections; otherwise, show options menu
                            if ( ( selectionCount > 0 ) && iShowContextMenu )
                                {
                                MenuBar()->SetMenuType(CEikMenuBar::EMenuContext);
                                iShowContextMenu = EFalse;
                                }
                            else
                                {
                                MenuBar()->SetMenuType(CEikMenuBar::EMenuOptions);
                                }
#endif //__ENABLE_MSK

                            if ( selectionCount > 0 )
                                {
                                // multiple selection
                                aMenuPane->SetItemDimmed( EMPXCmdUseAsCascade, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdSongDetails, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdAlbumArt, ETrue );
                                aMenuPane->SetItemDimmed( EMPXCmdFindInMusicShop, ETrue );
                                }
                            else
                                {
                                TBool fileDetailVisibility( FileDetailsOptionVisibilityL() );
                                // use the same criteria for showing/hiding song details
                                // and album art
                                aMenuPane->SetItemDimmed( EMPXCmdSongDetails,
                                    fileDetailVisibility );
                                aMenuPane->SetItemDimmed( EMPXCmdAlbumArt, ETrue );
#ifdef SINGLE_CLICK_INCLUDED
                                aMenuPane->SetItemDimmed( EMPXCmdUseAsCascade, ETrue );  
#else
                                TBool vis = ETrue;
                                TRAPD( err, vis = SetAsRingToneOptionVisibilityL() );

                                if ( err )
                                    {
                                    aMenuPane->SetItemDimmed( EMPXCmdUseAsCascade,
                                        ETrue); // dim the option if any sql error.
                                    }
                                else
                                    {
                                    aMenuPane->SetItemDimmed( EMPXCmdUseAsCascade,
                                        vis);
                                    }
#endif
                                
                                if ( array->IsItemBrokenLinkL( currentItem ) ||
                                    array->IsItemCorruptedL( currentItem ) )
                                    {
                                aMenuPane->SetItemDimmed( EMPXCmdUseAsCascade, ETrue );
                                    aMenuPane->SetItemDimmed( EMPXCmdSongDetails, ETrue );
                                    aMenuPane->SetItemDimmed( EMPXCmdAlbumArt, ETrue );
                                    }
                                else // Show this option even when song is DRM protected
                                    {
#ifdef SINGLE_CLICK_INCLUDED
                                    aMenuPane->SetItemDimmed( EMPXCmdFindInMusicShop, ETrue );
#else                                    
                                    aMenuPane->SetItemDimmed( EMPXCmdFindInMusicShop, EFalse );
#endif
                                    }
                                }
                            aMenuPane->SetItemDimmed( EMPXCmdRename, ETrue );
                            aMenuPane->SetItemDimmed( EMPXCmdPlaylistDetails, ETrue );
                            if ( !iUsingNokiaService )
                                {
                                aMenuPane->SetItemDimmed( EMPXCmdFindInMusicShop, ETrue );
                                }
                            if (iServiceHandler->HandleSubmenuL(*aMenuPane))
                                {
                                return;
                                }
                            break;
                            }
                        case EMPXCommand:
                            {
                            aMenuPane->SetItemDimmed( EMPXCmdUseAsCascade, ETrue );
                            aMenuPane->SetItemDimmed( EMPXCmdSongDetails, ETrue );
                            aMenuPane->SetItemDimmed( EMPXCmdRename, ETrue );
                            aMenuPane->SetItemDimmed( EMPXCmdAlbumArt, ETrue );
                            aMenuPane->SetItemDimmed( EMPXCmdFindInMusicShop, ETrue );
                            aMenuPane->SetItemDimmed( EMPXCmdPlaylistDetails, ETrue );

                            }
                            break;
                        default:
                            {
                            // other types, not handled
                            break;
                            }
                        }
                    }
                }
            else
                {
                // list empty
                aMenuPane->SetItemDimmed( EMPXCmdUseAsCascade, ETrue );
                aMenuPane->SetItemDimmed( EMPXCmdSongDetails, ETrue );
                aMenuPane->SetItemDimmed( EMPXCmdRename, ETrue );
                aMenuPane->SetItemDimmed( EMPXCmdAlbumArt, ETrue );
                aMenuPane->SetItemDimmed( EMPXCmdFindInMusicShop, ETrue );
                aMenuPane->SetItemDimmed( EMPXCmdPlaylistDetails, ETrue );
                }
            aMenuPane->SetItemDimmed( EAknCmdExit, iExitOptionHidden );
            break;
            }
        case R_MPX_ADD_TO_PL_SUB_MENU:
            {
            aMenuPane->SetItemDimmed( EMPXCmdAddToSavedPlaylist, !FindPlaylistsL() );
            break;
            }
        case R_MPX_COLLECTION_PLAY_VIA_SUB_MENU:
            {
            if ( iUpnpFrameworkSupport )
                {
                AddPlayersNamesToMenuL( *aMenuPane );
                }
            break;
            }
        case R_MPX_COLLECTION_VIEW_MUSIC_MENU:
            {
            MMPXPlaybackUtility* pdPlaybackUtility;
            pdPlaybackUtility = MMPXPlaybackUtility::UtilityL( TUid::Uid( KProgressDownloadUid ) );
            MMPXSource* pdsource( pdPlaybackUtility->Source() );
            MMPXSource* source( iPlaybackUtility->Source() );
            TBool hideNowPlaying;
            hideNowPlaying = ( (pdsource == 0)
                           &&  (source == 0));
            pdPlaybackUtility->Close();
            if ( hideNowPlaying )
                {
                aMenuPane->SetItemDimmed( EMPXCmdGoToNowPlaying, ETrue );
                }
            if (usbUnblockingStatus == EMPXUSBUnblockingPSStatusActive)
                {
                aMenuPane->SetItemDimmed( EMPXCmdRefreshLibrary, ETrue );
                }
            aMenuPane->SetItemDimmed( EAknCmdExit, iExitOptionHidden );
            aMenuPane->SetItemDimmed(
                EMPXCmdGoToMusicShop, iGoToMusicShopOptionHidden );
            if (iOperatorMusicStore)
            	{
            	aMenuPane->SetItemDimmed(EMPXCmdGoToMusicShop, ETrue);
            	}
            else
            	{
            	aMenuPane->SetItemDimmed(EMPXCmdGoToMultipleMusicShop, ETrue);
          		}
            break;
            }
        case R_MPX_COLLECTION_VIEW_EMBEDDED_PLAYLIST_VIEW:
            {
            // if it's from browser/messaging, display save option if
            // it has not been saved
            aMenuPane->SetItemDimmed( EMPXCmdSavePlaylist,
                ( !iCommonUiHelper->IsHostMessagingBrowserL() || !MPXTlsHelper::NeedSave() ) );
            aMenuPane->SetItemDimmed( EMPXCmdFindInMusicShop, isListEmpty );

            break;
            }
        case R_MPX_PLAYBACK_COLLECTION_MUSICSHOP_SUB_MENU:
        	{
        	aMenuPane->SetItemTextL(EMPXCmdGoToOperatorMusicShop,  iOperatorMusicStoreName->Des() );
        	break;
        	}
        case R_AVKON_MENUPANE_MARKABLE_LIST:
            {
            // Mark/Unmark submenu is displayed only if USB is on going
            if (usbUnblockingStatus == EMPXUSBUnblockingPSStatusActive)
                {
                MPX_DEBUG1("CMPXCollectionViewHgImp::DynInitMenuPaneL() dimmed Mark/Unmark submenu");
                aMenuPane->SetItemDimmed(EAknCmdEditListMenu, ETrue);
                }
            break;
            }
        default:
            {
            // Do nothing
            break;
            }
        }

#ifndef SINGLE_CLICK_INCLUDED
		if ( iServiceHandler->IsAiwMenu(aResourceId) && aResourceId == R_MPX_USE_AS_CASCADE )
            {
            MPX_DEBUG1( "CMPXCollectionViewHgImp::DynInitMenuPaneL(): Aiw menu for assign" );
            CAiwGenericParamList& paramList = iServiceHandler->InParamListL();
            FillAiwParametersL(paramList);
            iServiceHandler->InitializeMenuPaneL(*aMenuPane,
                                                aResourceId,
                                                EMPXCmdAiwCmdAssign,
                                                paramList);
            MPX_DEBUG1( "CMPXCollectionViewHgImp::DynInitMenuPaneL(): Aiw menu for assign end" );
            }
#endif

    if (!(aResourceId == R_AVKON_MENUPANE_MARKABLE_LIST && usbUnblockingStatus == EMPXUSBUnblockingPSStatusActive))
        {
        // Custom handling of menu pane for markable lists
        iContainer->HandleMarkableListDynInitMenuPane(
            aResourceId,
            aMenuPane );
        }
    }

// ---------------------------------------------------------------------------
// From MEikListBoxObserver
// Handles listbox events.
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::HandleListBoxEventL(
    CEikListBox* /*aListBox*/,
    TListBoxEvent aEventType)
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::HandleListBoxEventL" );
    MPX_DEBUG2( "CMPXCollectionViewHgImp::HandleListBoxEventL iLastDepth = %d", iLastDepth );
    MPX_PERF_CHECKPT( "Select collection item to open" );
    if ( iContainer )
        {
        //to keep/change focus on right song in rename/remove
#ifdef SINGLE_CLICK_INCLUDED
        if ( aEventType == EEventItemSingleClicked )         
#else
        if ( aEventType == EEventItemClicked )
#endif
            {
            if ( !iHandlingKeyEvent && iCollectionCacheReady )
                {
                CMPXCommonListBoxArrayBase* listboxArray( iContainer->ListBoxArray() );
                TInt currentIndex( iContainer->CurrentLbxItemIndex() );

                CMPXCommand* command = CMPXCommand::NewL();
                CleanupStack::PushL( command );
                command->SetTObjectValueL<TMPXCommandId>( KMPXCommandGeneralId,
                                                          KMPXCommandIdCollectionSelect );
                command->SetTObjectValueL( KMPXCommandCollectionSelectIndex, currentIndex );
                command->SetTObjectValueL<TBool>( KMPXCommandGeneralDoSync, ETrue );
                iCollectionUtility->Collection().CommandL( *command );
                CleanupStack::PopAndDestroy( command );
                }
            }

        if ( aEventType == EEventEnterKeyPressed || aEventType == EEventItemDoubleClicked
#ifdef SINGLE_CLICK_INCLUDED
            || aEventType == EEventItemSingleClicked
#endif
           )
            {
            if ( iContainer->IsInReorderMode() )
                {
                ProcessCommandL( iContainer->IsInReorderMode() ?
                    EMPXCmdReorderDrop : EMPXCmdReorderGrab );
                iIsGrabbed = !iIsGrabbed;
                }
            else if ( !iHandlingKeyEvent )
                {
                TMPXPlaybackState pbState( iPlaybackUtility->StateL() );
                TBool isEqual( EFalse );
                if ( pbState == EPbStatePlaying || pbState == EPbStatePaused )
                    {
                    // in currently playing view, check if current item is playing
                    if ( iContainer->CurrentLbxItemIndex() ==
                        iContainer->PlaybackIndex() )
                        {
                        isEqual = ETrue;
                        }
                    }

                if ( isEqual )
                    {
                    MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleListBoxEventL going to now playing view" );
                    if ( pbState == EPbStatePaused )
                        {
                        MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleListBoxEventL resuming playback" );
                        iPlaybackUtility->CommandL( EPbCmdPlay );
                        }
                    HandleCommandL( EMPXCmdGoToNowPlaying );
                    }
                else
                    {
                    CMPXCollectionPath* cpath = iCollectionUtility->Collection().PathL();
                    CleanupStack::PushL( cpath );
                    if ( cpath->Levels() == ( iLastDepth + 1 ) )
                        {
                        // navigated in one level
                        iLastDepth++;
                        iBottomIndex->AppendL(
                            iContainer->BottomLbxItemIndex() );
                        }
                    else
                        {
                        // invalid path, rebuild with all 0
                        iBottomIndex->Reset();
                        iLastDepth = cpath->Levels();
                        for ( TInt i = 0; i < iLastDepth; i++ )
                            {
                            iBottomIndex->AppendL( 0 );
                            }
                        }
                    CleanupStack::PopAndDestroy( cpath );
                    TInt currentItem( iContainer->CurrentLbxItemIndex() );
                    MPX_DEBUG2( "CMPXCollectionViewHgImp::HandleListBoxEventL Opening Item: %d", currentItem );

                    iHandlingKeyEvent = ETrue;

                    // Needed to reset the status of iPreservedState
                    if ( EPbStateStopped == pbState )
                        {
                        iPlaybackUtility->CommandL(EPbCmdResetPreserveState);
                        }

    #ifdef __ENABLE_PODCAST_IN_MUSIC_MENU
                    // check to see if user has selected podcast item
                    if ( (iLastDepth == KMusicCollectionMenuLevel) &&
                         (currentItem == KMusicMenuPodcastMenuItemIndex) &&
                         !iDisablePodcasting )
                        {
                        // open the podcast collection db plugin
                        iPodcast = ETrue;
                        CMPXCollectionPath* mainPodcastMenu = CMPXCollectionPath::NewL();
                        CleanupStack::PushL( mainPodcastMenu );
                        mainPodcastMenu->AppendL(KPodcastCollectionUid);
                        iCollectionUtility->Collection().OpenL( *mainPodcastMenu );
						iFirstIncrementalBatch = ETrue;
                        CleanupStack::PopAndDestroy( mainPodcastMenu );

                        // activate the podcast collection view
                        RArray<TUid> uids;
                        CleanupClosePushL( uids );
                        uids.AppendL( TUid::Uid( KMPXPluginTypeCollectionUid ) );
                        uids.AppendL( TUid::Uid( KPodcastCollectionUid ));
                        iViewUtility->ActivateViewL(uids);

                        CleanupStack::PopAndDestroy( &uids );
                        }
                    else
    #endif
                        {
                        if(iCollectionCacheReady)
                            {
                            CMPXCommonListBoxArrayBase* listboxArray( iContainer->ListBoxArray() );
                            TInt currentIndex( iContainer->CurrentLbxItemIndex() );
                            const CMPXMedia& media( listboxArray->MediaL( currentIndex ) );
                            TMPXGeneralType type(
                                media.ValueTObjectL<TMPXGeneralType>( KMPXMediaGeneralType ) );
                            TMPXGeneralCategory category(
                                media.ValueTObjectL<TMPXGeneralCategory>( KMPXMediaGeneralCategory ) );
                            if ( type != EMPXItem || category != EMPXSong )
                                {
                                if ( type == EMPXGroup && category== EMPXSong )
                                    {
                                    // dismiss for HGList
                                    //StartWaitNoteL( EMPXImmediatelyOpeningNote );
                                    }
                                else
                                    {
                                    //do not show wait note if opening a song
                                    // dismiss for HGList
                                    //StartWaitNoteL( EMPXOpeningNote );
                                    }
                                }
                            iCollectionUtility->Collection().OpenL( currentItem );
							iFirstIncrementalBatch = ETrue;
                            }
                        }

                    }
                }
            else
                {
                MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleListBoxEventL Busy, ignoring command" );
                }
            }
        }
    }

// ---------------------------------------------------------------------------
// From MEikCommandObserver
// Processes user commands.
// ---------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::ProcessCommandL(TInt aCommandId)
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::ProcessCommandL" );

    switch( aCommandId )
        {
        case EMPXCmdReorderDrop:
            {
            SaveCurrentPlaylistL();
            iContainer->ConfirmReorderL();
            DeactivateReorderGrabbedModeL( EFalse );
            SetNewCbaL( R_MPX_CUI_REORDER_GRAB_DONE_CBA );
            break;
            }
        case EMPXCmdReorderGrab:
            {
            SetNewCbaL( R_MPX_CUI_REORDER_DROP_CANCEL_CBA );
            ActivateReorderGrabbedModeL();
            break;
            }
        case EMPXCmdReorderCancel:
            {
            iCurrentHighlightedIndex = iContainer->GetOriginalIndex();
            MPX_DEBUG2( "CMPXCollectionViewHgImp::ProcessCommandL Setting iCurrentHighlightedIndex = %d", iCurrentHighlightedIndex );
            iContainer->CancelReorder();
            } // Fall through on purpose
        case EMPXCmdReorderDone:
            {
            DeactivateReorderGrabbedModeL( ETrue );
            break;
            }
        case EMPXCmdUpArrow:
            {
            iIgnoreNextFocusChangedMessage = ETrue;
            if ( iContainer->IsInReorderMode() )
                {
                iContainer->MoveReorderIndex( KMPXDirectionUp );
                }
            else
                {
                iDownCount = 0;

                if( iUpCount != KErrNotFound )
                    {
                    if( iUpCount++ > KIncrementalDirectionCount )
                        {
                        iIncrementalOpenUtil->SetDirection( CMPXCollectionOpenUtility::EFetchUp );
                        iUpCount = KErrNotFound;
                        }
                    }
                }
            break;
            }
        case EMPXCmdDownArrow:
            {
            iIgnoreNextFocusChangedMessage = ETrue;
            if ( iContainer->IsInReorderMode() )
                {
                iContainer->MoveReorderIndex( KMPXDirectionDown );
                }
            else
                {
                iUpCount = 0;

                if( iDownCount != KErrNotFound )
                    {
                    if( iDownCount++ > KIncrementalDirectionCount  )
                        {
                        iIncrementalOpenUtil->SetDirection( CMPXCollectionOpenUtility::EFetchDown );
                        iDownCount = KErrNotFound;
                        }

                    }
                }
            break;
            }
        case EMPXCmdCommonEnterKey:
            {
            // Handle list box event for enter key pressed
            TInt index( iContainer->CurrentLbxItemIndex() );
            if( index >= 0 )
            	{
                HandleListBoxEventL(
            	    NULL, // ignore
            	    EEventEnterKeyPressed );
            	}
            break;
            }

		case EMPXCmdGoToNowPlaying:
			{
			HandleCommandL( aCommandId );
			break;
			}
        case EMPXCmdUpArrowAfterListboxHandled:
            {
            if ( iContainer->IsInReorderMode() )
                {
                TInt index( iContainer->CurrentLbxItemIndex() );
                if ( index == iContainer->CurrentListItemCount() - 1 )
                    {
                    // if after up arrow is pressed, and end up at the
                    // lowest index.  list box looped, sync with listboxarray needed
                    iContainer->SetReorderIndex( index );
                    iContainer->HandleLbxItemAdditionL();
                    // need to set index and redraw
                    iContainer->SetLbxCurrentItemIndexAndDraw( index );
                    }
                UpdateReorderNaviPaneL();
                }
            break;
            }
        case EMPXCmdDownArrowAfterListboxHandled:
            {
            if ( iContainer->IsInReorderMode() )
                {
                TInt index( iContainer->CurrentLbxItemIndex() );
                if ( index == 0 )
                    {
                    // if after down arrow is pressed, and end up at the
                    // top index.  list box looped, sync with listboxarray needed
                    iContainer->SetReorderIndex( index );
                    iContainer->HandleLbxItemAdditionL();
                    }
                UpdateReorderNaviPaneL();
                }
            break;
            }
        case EMPXCmdCommonDelete:
            {
            if ( !iIsEmbedded )
                {
                StoreListboxItemIndexL();
                // embedded mode doesn't support delete key
                DeleteSelectedItemsL(aCommandId);
                }
            break;
            }
        case EMPXCmdCommonResourceChange:
            {
            iContainer->SetRect( ClientRect() );
            break;
            }
        case EAknSoftkeyEmpty:
            {
            // do nothing.  handled to avoid "unsupported" message
            break;
            }
#ifdef __ENABLE_MSK
        case EMPXCmdCommonUpdateMiddleSoftKey:
            {
            // Determine middle soft key labeling
            UpdateMiddleSoftKeyDisplayL( iCurrentMskId );
            break;
            }
        case EAknSoftkeyContextOptions :
            {
            // set context menu flag
            iShowContextMenu = ETrue;
            // open context menu (by processing "Options" command)
            if ( iContainer )
                {
                iSelectionIndexCache = iContainer->CurrentSelectionIndicesL(); // not owned
                MPX_DEBUG2( "CMPXCollectionViewHgImp::ProcessCommandL count = %d", iSelectionIndexCache->Count() );
                }
            CAknView::ProcessCommandL( EAknSoftkeyOptions );
            break;
            }
#endif // __ENABLE_MSK
        case EAknCmdExit:
			{
            HandleCommandL( aCommandId );
			CAknView::ProcessCommandL( aCommandId );
			break;
			}
		case EAknSoftkeyOptions:
            {
            if ( iContainer )
                {
                iSelectionIndexCache = iContainer->CurrentSelectionIndicesL(); // not owned
                MPX_DEBUG2( "CMPXCollectionViewHgImp::ProcessCommandL count = %d", iSelectionIndexCache->Count() );
                }
            }
        default:
            {
            CAknView::ProcessCommandL( aCommandId );
            break;
            }
        }
    }

// -----------------------------------------------------------------------------
// CMPXCollectionViewHgImp::LaunchMusicShopL
// Launch music shop application
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::LaunchMusicShopL()
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::LaunchMusicShopL" );

    if ( iMusicStoreUID != 0)
        {
    TApaTaskList tasList( iCoeEnv->WsSession() );
        TApaTask task = tasList.FindApp( TUid::Uid(iMusicStoreUID) );

    if ( task.Exists() )
        {
        task.BringToForeground();
        }
    else
        {
        RApaLsSession session;
        if ( KErrNone == session.Connect() )
            {
            CleanupClosePushL( session );
            TThreadId threadId;
                session.CreateDocument( KNullDesC, TUid::Uid(iMusicStoreUID), threadId );
            CleanupStack::PopAndDestroy(&session);
                }
            }
        }
    }


// -----------------------------------------------------------------------------
// CMPlayerCategoryView::DoFindInMusicShopL
// Handle find in music shop event
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::DoFindInMusicShopL( const TDesC& aSongName,
                                                const TDesC& aArtistName,
                                                const TDesC& aAlbumName )
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::DoFindInMusicShopL" );
    CMPXFindInMShop* finder = CMPXFindInMShop::NewL();
    CleanupStack::PushL( finder );
    HBufC* url = NULL;
    url = finder->CreateSearchURLL( aSongName,
                                     aArtistName,
                                     aAlbumName,
                                     KNullDesC,     // Composer - Not used
                                     KNullDesC );   // Genre - Not used
    CleanupStack::PushL(url);   // the pointer will be poped
    RProperty::Set( TUid::Uid(iMusicStoreUID),
                    KMShopCategoryId,
                    KFindInMShopKeyValid );  // Set Key to Valid

    RProperty::Set( TUid::Uid(iMusicStoreUID),
                    KMShopCategoryName,
                    *url );

    LaunchMusicShopL();


    if(url)
        {
        CleanupStack::PopAndDestroy(url);
        }

    CleanupStack::PopAndDestroy( finder ); // finder
    REComSession::FinalClose();
    }


// ----------------------------------------------------------------------------
// CMPXCollectionViewHgImp::SetParamL
// Set the parameter passed in from viewframework to the current select index
// ----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::SetParamL( const TDesC* aParam )
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::SetParamL" );
    delete iCurrentSelectedIndex;
    iCurrentSelectedIndex = NULL;
    iCurrentSelectedIndex = aParam->AllocL();    //  aParam = L"0" for 1st item
    }


// -----------------------------------------------------------------------------
// CMPlayerCategoryView::DoGetSongMediaPropertyL
// Handle find in music shop event
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::DoGetSongMediaPropertyL()
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::DoGetSongMediaPropertyL" );

    if ( iCurrentSelectedIndex )
        {
        TLex currentSelectedIndexLex( iCurrentSelectedIndex->Des() );
        TInt lexToInt = NULL;
        if ( currentSelectedIndexLex.Val( lexToInt ) == KErrNone )
            {
            // Get media property for the current song
            CMPXCollectionPath* cpath = iCollectionUtility->Collection().PathL();
            CleanupStack::PushL( cpath );

            cpath->Set( lexToInt );
            RArray<TMPXAttribute> attrs;
            CleanupClosePushL(attrs);
            // to get EMPXMediaGeneralTitle
            attrs.Append( KMPXMediaGeneralTitle );
            // to get EMPXMediaMusicArtist and EMPXMediaMusicAlbum
            attrs.Append( KMPXMediaMusicArtist );
            attrs.Append( KMPXMediaMusicAlbum );

            // Call MediaL and handle callback at HandleCollectionMediaL
            iCollectionUtility->Collection().MediaL( *cpath, attrs.Array() );
            CleanupStack::PopAndDestroy( &attrs );
            CleanupStack::PopAndDestroy( cpath );
            }
        }

    }

// -----------------------------------------------------------------------------
// CMPXCollectionViewHgImp::HandleFindAllL
// Handle callback for "find" operation
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::HandleFindAllL(
    const CMPXMedia& aResults,
    TBool aComplete,
    TInt aError )
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::HandleFindAllL" );
    if ( aError == KErrNone )
        {
        switch ( iCurrentFindAllLOp )
            {
            case EMPXOpFindAllLAlbumArtistAddToNewPlaylist:
                {
                iNumSongAddedToPlaylist = aResults.ValueTObjectL<TInt>(
                    KMPXMediaArrayCount );
                TBool ret = iCommonUiHelper->CreatePlaylistL(
                    aResults, this, this );
                if ( !ret )
                    {
                    iAddingToNewPlaylist = EFalse;
                    }
                break;
                }
            case EMPXOpFindAllLAlbumArtistAddToSavedPlaylist:
                {
                if ( !iUserPlaylists )
                    {
                    MPX_DEBUG1( "CMPXCollectionViewHgImp::HandleFindAllL Null iUserPlaylists" );
                    User::Leave( KErrArgument );
                    }
                iNumSongAddedToPlaylist = aResults.ValueTObjectL<TInt>(
                    KMPXMediaArrayCount );
                MPX_TRAPD( err, iCommonUiHelper->AddToSavedPlaylistL(
                    *iUserPlaylists, aResults, this, this ) );
                if ( err != KErrNone )
                    {
                    HandleError( err );
                    }
                break;
                }
            case EMPXOpFindAllLRenameAlbum:
            case EMPXOpFindAllLRenameArtist:
            case EMPXOpFindAllLRenameGenre:
            case EMPXOpFindAllLRenameComposer:
                {
                const CMPXMediaArray* mediaArray =
                    aResults.Value<CMPXMediaArray>( KMPXMediaArrayContents );
                User::LeaveIfNull(const_cast<CMPXMediaArray*>(mediaArray));

                iSetMediaLCount = mediaArray->Count();
                iInvalidFileExist = EFalse;
                TInt invalidItemCount( 0 );
                MPX_DEBUG2( "CMPXCollectionViewHgImp::HandleFindAllL Rename song count = %d", iSetMediaLCount );
                iIsWaitNoteCanceled = EFalse;
                HBufC* waitNoteString( NULL );
                if ( iSetMediaLCount > 1 )
                    {
                    // multiple item
                    waitNoteString = StringLoader::LoadLC(
                        R_MPX_COLLECTION_NOTE_UPDATING_MULTIPLE_ITEMS,
                        iSetMediaLCount );
                    }
                else
                    {
                    // single item
                    waitNoteString = StringLoader::LoadLC(
                        R_MPX_COLLECTION_NOTE_UPDATING_ITEM );
                    }
                HandleCommandL( EMPXCmdIgnoreExternalCommand );
                iCommonUiHelper->ShowWaitNoteL( *waitNoteString,
                    R_MPX_COLLECTION_WAITNOTE_SOFTKEYS_EMPTY_STOP, EFalse, this );
                CleanupStack::PopAndDestroy( waitNoteString );

                TPtrC art( KNullDesC );
                if ( (iCurrentFindAllLOp == EMPXOpFindAllLRenameAlbum || iCurrentFindAllLOp == EMPXOpFindAllLRenameArtist )&&
                        iContainer )
                    {
                    CMPXCommonListBoxArrayBase* listboxArray(
                        iContainer->ListBoxArray() );
                    TInt currentIndex( iContainer->CurrentLbxItemIndex() );
                    const CMPXMedia& currentMedia( listboxArray->MediaL( currentIndex ) );
                    if ( currentMedia.IsSupported( KMPXMediaMusicAlbumArtFileName ) )
                        {
                        art.Set( currentMedia.ValueText( KMPXMediaMusicAlbumArtFileName ) );
                        }
                    }

                CMPXMediaArray* entryArray = CMPXMediaArray::NewL();
                CleanupStack::PushL( entryArray );
                TUid collectionId( KNullUid );
                for ( TInt i = 0; i < iSetMediaLCount && !iIsWaitNoteCanceled; i++ )
                    {
                    CMPXMedia* media( mediaArray->AtL( i ) );
                    TUint flags( 0 );
                    if( media->IsSupported( KMPXMediaGeneralFlags ) )
                        {
                        flags = media->ValueTObjectL<TUint>( KMPXMediaGeneralFlags );
                        }
                    const TDesC& songUri =
                        media->ValueText( KMPXMediaGeneralUri );
                    TBool fileExist( ConeUtils::FileExists( songUri ) );
                    if (!(flags & KMPXMediaGeneralFlagsIsInvalid)
                     && !(flags & KMPXMediaGeneralFlagsIsCorrupted)
                     && fileExist )
                        {
                        CMPXMedia* entry = CMPXMedia::NewL();
                        CleanupStack::PushL( entry );
                        entry->SetTextValueL( KMPXMediaGeneralUri, songUri );
                        TMPXItemId id( media->ValueTObjectL<TMPXItemId>(
                                        KMPXMediaGeneralId ) );
                        collectionId = media->ValueTObjectL<TUid>(
                                             KMPXMediaGeneralCollectionId );
                        entry->SetTObjectValueL<TMPXItemId>(
                            KMPXMediaGeneralId, id );
                        entry->SetTObjectValueL<TUid>(
                            KMPXMediaGeneralCollectionId, collectionId );
                        entry->SetTObjectValueL<TMPXGeneralType>(
                            KMPXMediaGeneralType, EMPXItem );
                        entry->SetTObjectValueL<TMPXGeneralCategory>(
                            KMPXMediaGeneralCategory, EMPXSong );

                        TPtrC ptr( songUri );
                        MPX_DEBUG3( "CMPXCollectionViewHgImp::HandleFindAllL setting item id 0x%x, uri %S", id.iId1, &ptr );
                        switch ( iCurrentFindAllLOp )
                            {
                            case EMPXOpFindAllLRenameAlbum:
                                {
                                if ( art.Compare( KNullDesC ) != 0 &&
                                        art.Compare(
                                            media->ValueText( KMPXMediaMusicAlbumArtFileName ) ) == 0 )
                                    {
                                    entry->SetTextValueL(
                                        KMPXMediaMusicAlbumArtFileName,
                                        art );
                                    }
                                entry->SetTextValueL(
                                    KMPXMediaMusicAlbum, *iNewName );
                                break;
                                }
                            case EMPXOpFindAllLRenameArtist:
                                {
                                if ( art.Compare( KNullDesC ) != 0 &&
                                        art.Compare(
                                            media->ValueText( KMPXMediaMusicAlbumArtFileName ) ) == 0 )
                                    {
                                    entry->SetTextValueL(
                                        KMPXMediaMusicAlbumArtFileName,
                                        art );
                                    }
                                entry->SetTextValueL(
                                    KMPXMediaMusicArtist, *iNewName );
                                break;
                                }
                            case EMPXOpFindAllLRenameGenre:
                                {
                                entry->SetTextValueL(
                                    KMPXMediaMusicGenre, *iNewName );
                                break;
                                }
                            case EMPXOpFindAllLRenameComposer:
                                {
                                entry->SetTextValueL(
                                    KMPXMediaMusicComposer, *iNewName );
                                break;
                                }
                            default:
                                {
                                // should not reach here
                                ASSERT( 0 );
                                break;
                                }
                            }
                        if ( (iCurrentFindAllLOp == EMPXOpFindAllLRenameAlbum || iCurrentFindAllLOp == EMPXOpFindAllLRenameArtist) &&
                                art.Compare( KNullDesC ) != 0 &&
                                art.Compare(
                                    media->ValueText( KMPXMediaMusicAlbumArtFileName ) ) == 0 )
                            {
                            entryArray->InsertL( entry, 0 );  // ownership xfer
                            }
                        else
                            {
                            entryArray->AppendL( entry );  // ownership xfer
                            }
                        CleanupStack::Pop( entry );
                        }
                    else
                        {
                        iInvalidFileExist = ETrue;
                        invalidItemCount++;
                        if ( !fileExist )
                            {
                            UpdateDatabaseFlagL( KErrNotFound, *media,
                                KMPXMediaGeneralFlagsIsInvalid, ETrue, EFalse );
                            }
                        }
                    }
                // Package array of items to set
                //
                CMPXMedia* setData = CMPXMedia::NewL();
                CleanupStack::PushL( setData );
                setData->SetTObjectValueL( KMPXMediaGeneralType, EMPXGroup );
                setData->SetCObjectValueL( KMPXMediaArrayContents, entryArray );

                // Generate the command
                //
                CMPXCommand* command = CMPXCommand::NewL();
                CleanupStack::PushL( command );
                command->SetTObjectValueL<TMPXCommandId>( KMPXCommandGeneralId,
                                                          KMPXCommandIdCollectionSet );
                command->SetTObjectValueL<TInt>( KMPXCommandGeneralCollectionId,
                                                 collectionId.iUid);
                command->SetCObjectValueL( KMPXCommandColSetMedia, setData );

                iCollectionUtility->Collection().CommandL( *command );

                // Cleanup
                CleanupStack::PopAndDestroy( command );
                CleanupStack::PopAndDestroy( setData );
                CleanupStack::PopAndDestroy( entryArray );

                iSetMediaLCount = 1;  // 1 async set
                MPX_DEBUG3( "CMPXCollectionViewHgImp::HandleFindAllL valid items = %d, invalid items = %d", iSetMediaLCount, invalidItemCount );
                if ( iSetMediaLCount == 0 )
                    {
                    // if all items are invalid, display note
                    // now instead of waiting for callback
                    HandleRenameOpCompleteL();
                    }
                break;
                }
            case EMPXOpFindAllLPlaylistTracksCount:
                {
                TInt trackCount = aResults.ValueTObjectL<TInt>( KMPXMediaArrayCount );
                MPX_DEBUG2( "CMPXCollectionViewHgImp:: playlist tracks count = %d", trackCount );
                if ( trackCount == 0 )
                    {
                    // empty playlist, display info note
                    HBufC* string = StringLoader::LoadLC(
                        R_MPX_COLLECTION_NOTE_EMPTY_PLAYLIST );
                    iCommonUiHelper->DisplayInfoNoteL( *string );
                    CleanupStack::PopAndDestroy( string );
                    }
                else
                    {
                    HandleCommandL( EMPXCmdForcePlay );
                    }
                break;
                }
            case EMPXOpFindAllLUpnp:
                {
                if ( iUpnpFrameworkSupport )
                    {
                    DoHandleCopyToRemoteL( aResults, aComplete );
                    }
                break;
                }
            case EMPXOpFindAllLUpnpPlayback:
                {
                if ( iUpnpFrameworkSupport )
                    {
                    TInt trackCount = aResults.ValueTObjectL<TInt>( KMPXMediaArrayCount );
                    MPX_DEBUG2( "CMPXCollectionViewHgImp:: playlist tracks count = %d", trackCount );
                    if ( trackCount > 0 )
                        {
                        TInt currentListBoxItemIndex(
                            iContainer->CurrentLbxItemIndex() );
                        if ( currentListBoxItemIndex >= 0 )
                            {
                            GetCurrentPlayerDetails();

                            // Needed to reset the status of iPreservedState
                            if ( EPbStateStopped == iPlaybackUtility->StateL() )
                                {
                                iPlaybackUtility->CommandL(EPbCmdResetPreserveState);
                                }
                            if(iCollectionCacheReady)
                                {
                                iCollectionUtility->Collection().OpenL(
                                                currentListBoxItemIndex,
                                                EMPXOpenPlaylistOnly);
								iFirstIncrementalBatch = ETrue;
                                }
                            }
                        }
                    else
                        {
                        // empty playlist, display info note
                        HBufC* string = StringLoader::LoadLC(
                            R_MPX_COLLECTION_NOTE_EMPTY_PLAYLIST );
                        iCommonUiHelper->DisplayInfoNoteL( *string );
                        CleanupStack::PopAndDestroy( string );
                        }
                    }
                break;
                }
            default:
                {
                // should not reach here
                break;
                }
            }
        }
    else
        {
        HandleError( aError );
        }
    iCurrentFindAllLOp = EMPXOpFindAllLIdle;

    if ( !iUpnpFrameworkSupport )
        {
        // Remove compilation warnings
        (void)aComplete;
        }
    }

// -----------------------------------------------------------------------------
// CMPXCollectionViewHgImp::HandleViewActivation
// Handle view activation
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::HandleViewActivation(
    const TUid& aCurrentViewType,
    const TUid& /*aPreviousViewType*/ )
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::HandleViewActivation" );

    if ( aCurrentViewType.iUid == KMPXPluginTypeCollectionUid )
        {
        if( iAddingSong )
            {
            iAddingSong = EFalse;
            TRAP_IGNORE( GetDurationL() );
            TRAP_IGNORE( UpdateNaviPaneL() );
            }
        if( iInAlbumArtDialog )
            {
            iInAlbumArtDialog = EFalse;
            TRAP_IGNORE( UpdateTitlePaneL() );
            }
        if( iInSongDetails )
            {
            iInSongDetails = EFalse;
            }
        }
    }

// -----------------------------------------------------------------------------
// CMPXCollectionViewHgImp::HandleViewUpdate
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::HandleViewUpdate(
    TUid /* aViewUid */,
    MMPXViewActivationObserver::TViewUpdateEvent /* aUpdateEvent */,
    TBool /* aLoaded */,
    TInt /* aData */)
    {
    // Do nothing, this should be handled by the AppUI
    }

// -----------------------------------------------------------------------------
// CMPXCollectionViewHgImp::HandleViewActivation
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::HandleViewActivation(const TVwsViewId& aNewlyActivatedViewId,
                                                 const TVwsViewId& /*aViewIdToBeDeactivated */)
    {
    if( aNewlyActivatedViewId.iAppUid == TUid::Uid(KMusicPlayerAppUidConstant) &&
        aNewlyActivatedViewId.iViewUid == Id() )
        {
        TRAP_IGNORE( UpdateNaviPaneL() );
        }
    }

// -----------------------------------------------------------------------------
// CMPXCollectionViewHgImp::HandleViewDeactivation
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::HandleViewDeactivation(const TVwsViewId& aViewIdToBeDeactivated,
                                                   const TVwsViewId& /*aNewlyActivatedViewId*/)
    {
    if( aViewIdToBeDeactivated.iAppUid == TUid::Uid(KMusicPlayerAppUidConstant) &&
        aViewIdToBeDeactivated.iViewUid == Id() )
        {
        if( iContainer )
            {
            if ( iNaviPane && iNaviDecorator )
                {
                if (iNaviPane->Top() == iNaviDecorator) // Only pop if it's the top, don't pop when it's behind a dialog
                    iNaviPane->Pop( iNaviDecorator );
                }
            }
        }
    }

// -----------------------------------------------------------------------------
// CMPXCollectionViewHgImp::FillAiwParameters
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::FillAiwParametersL(
    CAiwGenericParamList& aParamList )
    {
    CMPXCommonListBoxArrayBase* array( iContainer->ListBoxArray() );
    const CMPXMedia& media = array->MediaL(
        iContainer->CurrentLbxItemIndex() );
    TPtrC location( media.ValueText(KMPXMediaGeneralUri) );
    TPtrC mimeType( media.ValueText(KMPXMediaGeneralMimeType) );

    if ( !location.Length() )
        {
        if ( media.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) == KMPXInvalidItemId )
            {
            // highlighted item is not yet available
            MPX_DEBUG1( "CMPXCollectionViewHgImp::FillAiwParametersL item not yet fetched" );
            User::Leave( KMPXErrDataNotReady );
            }
        else
            {
            TMPXItemId id(
                    media.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) );
            CMPXMedia* criteria = CMPXMedia::NewL();
            CleanupStack::PushL( criteria );
            criteria->SetTObjectValueL<TMPXGeneralType>(
                KMPXMediaGeneralType, EMPXItem );
            criteria->SetTObjectValueL<TMPXGeneralCategory>(
                KMPXMediaGeneralCategory, EMPXSong );
            criteria->SetTObjectValueL<TMPXItemId>( KMPXMediaGeneralId, id );

            RArray<TMPXAttribute> attrs;
            CleanupClosePushL( attrs );
            attrs.Append( KMPXMediaGeneralUri );
            attrs.Append( KMPXMediaGeneralMimeType );

            CMPXMedia* songInfo = iCollectionUtility->Collection().FindAllL( *criteria,
                                                             attrs.Array() );
            CleanupStack::PopAndDestroy( &attrs );
            CleanupStack::PushL( songInfo );

            const CMPXMediaArray* mediaArray(
                songInfo->Value<CMPXMediaArray>( KMPXMediaArrayContents ) );
            User::LeaveIfNull(const_cast<CMPXMediaArray*>(mediaArray));

            if ( mediaArray->Count() > 0 )
                {
                CMPXMedia* si( mediaArray->AtL( 0 ) );
                location.Set( si->ValueText(KMPXMediaGeneralUri) );
                mimeType.Set( si->ValueText(KMPXMediaGeneralMimeType) );
                }
            CleanupStack::PopAndDestroy( songInfo );
            CleanupStack::PopAndDestroy( criteria );
            }
        }

    TAiwVariant varMime(mimeType);
    if ( !mimeType.Length() && ( iMediaRecognizer ) )
        {
        varMime.Set(iMediaRecognizer->MimeTypeL(location));
        }
    TAiwGenericParam paramMime(EGenericParamMIMEType, varMime);
    aParamList.Reset();
    aParamList.AppendL(paramMime);
    TAiwVariant varFile(location);
    TAiwGenericParam paramFile(EGenericParamFile, varFile);
    aParamList.AppendL(paramFile);
    }

// -----------------------------------------------------------------------------
// CMPXCollectionViewHgImp::GetUint32Presentation
//
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::GetUint32Presentation( TUint32& aResult,
                                                   const TDesC8& aBuf,
                                                   TInt aOffset )
    {
    aResult = 0;
    const TInt KProEngByteLength( 8 );
    const TInt length( aBuf.Length() );
    const TInt maxBitShift( KProEngByteLength * ( length - 1 ) );

    for( TInt i( 0 ); i<length; ++i )
        {
        aResult |= ( aBuf[aOffset + i] <<
                   ( maxBitShift - ( KProEngByteLength * i ) ) );
        }
    }

// -----------------------------------------------------------------------------
// CMPXCollectionViewHgImp::LaunchMusicShopL
// Launch music shop application
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::LaunchOperatorJavaMusicShopL(TUid aUid)
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::LaunchOperatorMusicShopL" );
    TThreadId threadId;
    RApaLsSession apaSession;
    User::LeaveIfError( apaSession.Connect() );
    CleanupClosePushL( apaSession );
    apaSession.StartDocument(_L(""), aUid, threadId);
    CleanupStack::PopAndDestroy( &apaSession ); // close apaSession
    }

// -----------------------------------------------------------------------------
// CMPXCollectionViewHgImp::LaunchMusicShopL
// Launch music shop application
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::LaunchOperatorNativeMusicShopL()
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::LaunchMusicShopL" );

    TApaTaskList tasList( iCoeEnv->WsSession() );
    TApaTask task = tasList.FindApp( TUid::Uid(iOperatorNativeMusicStoreUID) );

    if ( task.Exists() )
        {
        task.BringToForeground();
        }
    else
        {
        RApaLsSession session;
        if ( KErrNone == session.Connect() )
            {
            CleanupClosePushL( session );
            TThreadId threadId;
            session.CreateDocument( KNullDesC, TUid::Uid(iOperatorNativeMusicStoreUID), threadId );
            CleanupStack::PopAndDestroy(&session);
            }
        }
    }
// -----------------------------------------------------------------------------
// CMPXCollectionViewHgImp::LaunchOperatorURLMusicShopL
// Launch music shop URL application
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::LaunchOperatorURLMusicShopL()
    {
    MPX_FUNC( "CMPXCollectionViewHgImp::LaunchOperatorURLMusicShopL" );
    const TUid KOSSBrowserUidValue = {0x10008D39}; // 0x1020724D for S60 3rd Ed
    TUid id(KOSSBrowserUidValue);
    TApaTaskList taskList(CEikonEnv::Static()->WsSession());
    TApaTask task = taskList.FindApp(id);

    if ( task.Exists() )
        {
        task.BringToForeground();
        if ( iOperatorMusicStoreURI->Length() != NULL )
            {
            TBuf8<KMPXMaxHistoryLength> tempUrl;
            tempUrl.Copy(iOperatorMusicStoreURI->Des());
            task.SendMessage(TUid::Uid(0), tempUrl);
            }
        }
    else
        {
        RApaLsSession apaLsSession;
        if ( KErrNone == apaLsSession.Connect() )
            {
            CleanupClosePushL( apaLsSession );
            TThreadId threadId;

 			apaLsSession.StartDocument(*iOperatorMusicStoreURI, KOSSBrowserUidValue, threadId);
         	CleanupStack::PopAndDestroy(&apaLsSession);
            }
		}
	}

// -----------------------------------------------------------------------------
// CMPXCollectionViewHgImp::StoreListboxItemIndexL
// Stores the current list box item index.
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::StoreListboxItemIndexL()
	{
    TInt currentIndex( iContainer->CurrentLbxItemIndex() );

	CMPXCommand* command = CMPXCommand::NewL();
	CleanupStack::PushL( command );
	command->SetTObjectValueL<TMPXCommandId>( KMPXCommandGeneralId,
											  KMPXCommandIdCollectionSelect );
	command->SetTObjectValueL( KMPXCommandCollectionSelectIndex, currentIndex );
	command->SetTObjectValueL<TBool>( KMPXCommandGeneralDoSync, ETrue );
	iCollectionUtility->Collection().CommandL( *command );
	CleanupStack::PopAndDestroy( command );
	}


// -----------------------------------------------------------------------------
// CMPXCollectionViewHgImp::ChangeCbaVisibility
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::ChangeCbaVisibility( TBool aVisible )
    {
    CEikButtonGroupContainer* cba = Cba();
    if( cba )
		{
        cba->MakeVisible( aVisible );
		cba->DrawDeferred();
		}
    }

void CMPXCollectionViewHgImp::UpdateCba()
    {
    TRAP_IGNORE( 
        {
        CMPXCollectionPath* cpath( iCollectionUtility->Collection().PathL() );
        CleanupStack::PushL( cpath );
    
        CMPXCommonListBoxArrayBase* listboxArray(
            iContainer->ListBoxArray() );
        const CMPXMedia& media( listboxArray->ContainerMedia() );
    
        TMPXGeneralType containerType( EMPXNoType );
        if ( media.IsSupported( KMPXMediaGeneralType ) )
            {
            containerType = media.ValueTObjectL<TMPXGeneralType>( KMPXMediaGeneralType );
            }
    
        TMPXGeneralCategory containerCategory( EMPXNoCategory );
        if ( media.IsSupported( KMPXMediaGeneralCategory ) )
            {
            containerCategory = media.ValueTObjectL<TMPXGeneralCategory>( KMPXMediaGeneralCategory );
            }
        TBool landscapeOrientation = Layout_Meta_Data::IsLandscapeOrientation();
        CEikButtonGroupContainer* cba = Cba();
        if ( cba && containerType == EMPXGroup && containerCategory == EMPXAlbum && landscapeOrientation )
            {
            cba->SetCommandSetL( R_MPX_COLLECTION_TRANSPARENT_CBA );
            cba->MakeVisible( EFalse );
            cba->DrawDeferred();
            }
        else if ( cba )
            {
            cba->SetCommandSetL(
                ( cpath->Levels() == 3 && !iIsEmbedded ) ?
                R_MPX_OPTIONS_HIDE_CBA : R_AVKON_SOFTKEYS_OPTIONS_BACK );
            cba->MakeVisible( ETrue );
            cba->DrawDeferred();
            }
        CleanupStack::PopAndDestroy(cpath);
        });
    }

// -----------------------------------------------------------------------------
// CMPXCollectionViewHgImp::OpenAllSongsL
// Open the collection at all songs level.
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::OpenAllSongsL()
	{
	CMPXCollectionPath* path = iCollectionUiHelper->MusicAllSongsPathL();
	CleanupStack::PushL( path );
	iCollectionUtility->Collection().OpenL( *path );
	CleanupStack::PopAndDestroy( path );
	}


// -----------------------------------------------------------------------------
// CMPXCollectionViewHgImp::OpenArtistAlbumsL
// Open the collection at artist & albums level.
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::OpenArtistAlbumsL()
	{
	CMPXCollectionPath* path = iCollectionUiHelper->MusicMenuPathL();
	CleanupStack::PushL( path );
	path->AppendL(KMPXCollectionArtistAlbum);
	iCollectionUtility->Collection().OpenL( *path );
	CleanupStack::PopAndDestroy( path );
	}

// -----------------------------------------------------------------------------
// CMPXCollectionViewHgImp::OpenPlaylistsL
// Open the collection at playlists level.
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::OpenPlaylistsL()
	{
	CMPXCollectionPath* path = iCollectionUiHelper->MusicPlaylistPathL();
	CleanupStack::PushL( path );
	iCollectionUtility->Collection().OpenL( *path );
	CleanupStack::PopAndDestroy( path );
	}

// -----------------------------------------------------------------------------
// CMPXCollectionViewHgImp::OpenGenreL
// Open the collection at genre level.
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::OpenGenreL()
	{
	CMPXCollectionPath* path = iCollectionUiHelper->MusicMenuPathL();
	CleanupStack::PushL( path );
	path->AppendL(KMPXCollectionGenre); // Genre
	iCollectionUtility->Collection().OpenL( *path );
	CleanupStack::PopAndDestroy( path );
	}

// -----------------------------------------------------------------------------
// CMPXCollectionViewHgImp::OpenPodcastsL
// Open the collection at podcasts level.
// -----------------------------------------------------------------------------
//
void CMPXCollectionViewHgImp::OpenPodcastsL()
	{
	CMPXCollectionPath* path = iCollectionUiHelper->PodCastMenuPathL();
	CleanupStack::PushL( path );
	iCollectionUtility->Collection().OpenL( *path );
	CleanupStack::PopAndDestroy( path );
	}

//  End of File
