profilesservices/MediaFileList/Src/mediafiledialogstate.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:20:44 +0100
branchRCL_3
changeset 25 7e0eff37aedb
parent 0 8c5d936e5675
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* Copyright (c) 2007 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:   Class used to deal with the items of the Main view
*
*/




// INCLUDE FILES

#include "mediafiledialogstate.h"
#include "mediafiledialogutils.h"

#include <mediafilelist.rsg>  // for .rss resource enums
#include <StringLoader.h>



/******************************************************************************
 * class TMFListItem
 ******************************************************************************/


// -------------------------------------------------------------------------------
// TMFListItem::TMFListItem
//
// -------------------------------------------------------------------------------
//
TMFListItem::TMFListItem()
 : iListIndex(KErrNotFound), iFolderId(KErrNotFound), iParentFolderId(KErrNotFound),
   iChildFolderId(KErrNotFound), iPersistent(ETrue),
   iHidden(EFalse), iIconId(EEIconEmpty), iChildIconId(EEIconEmpty),
   iUnknownCount(KErrNotFound)
	 {
	 }



/******************************************************************************
 * class TMFCurrentItemInfo
 ******************************************************************************/


// -------------------------------------------------------------------------------
// TMFCurrentItemInfo::TMFCurrentItemInfo
//
// -------------------------------------------------------------------------------
//
void TMFCurrentItemInfo::Reset()
    {
    iIndexCheckNeeded = EFalse;
    iItemIndex = KErrNotFound;
    iMediaFileId = KErrNotFound;
    iFolderId = KErrNotFound;
    iFolderText = KNullDesC;
    }


/******************************************************************************
 * class CMediaFileDialogState
 ******************************************************************************/


// -----------------------------------------------------------------------------
// CMediaFileDialogState::NewL
//
// -----------------------------------------------------------------------------
CMediaFileDialogState* CMediaFileDialogState::NewL()
    {
    CMediaFileDialogState* self = new ( ELeave ) CMediaFileDialogState();
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );

    return self;
    }

// -----------------------------------------------------------------------------
// CMediaFileDialogState::CMediaFileDialogState
// 
// -----------------------------------------------------------------------------
//
CMediaFileDialogState::CMediaFileDialogState()
	{
	iCurrentFolderId = EEFolderRoot;
	iCurrentFolderIndex = 0;
	iListPosition = KErrNotFound;
	
    iQueryFolderId = EEFolderRoot;
    iQueryDirection = EEQueryDown;
    iQueryText = KNullDesC;
    iPreviousFolderId = KErrNotFound;
    iCurrentItemInfo.Reset();
    }

// -----------------------------------------------------------------------------
// CMediaFileDialogState::ConstructL
//
// -----------------------------------------------------------------------------
//
void CMediaFileDialogState::ConstructL()
    {
    AddPermanentItemsL();
    } 

// ----------------------------------------------------------------------------
// Destructor
//
// ----------------------------------------------------------------------------
//
CMediaFileDialogState::~CMediaFileDialogState()
    {
    iList.Close();
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::Init
//
// -----------------------------------------------------------------------------
//
void CMediaFileDialogState::Init()
    {
    // initialize non-persistent folders
    TInt count = iList.Count();
    for ( TInt i=0; i<count; i++ )
        {
        TMFListItem& item = iList[i];
        if ( !item.iPersistent )
            {
            item.iListIndex = KErrNotFound;
            item.iText = KNullDesC;
            item.iTitle = KNullDesC;
            }
        }

	iCurrentFolderId = EEFolderRoot;
	iCurrentFolderIndex = 0;
	iListPosition = KErrNotFound;
  	
    iQueryFolderId = EEFolderRoot;
    iQueryDirection = EEQueryDown;
    iQueryText = KNullDesC;
    iPreviousFolderId = KErrNotFound;
    iCurrentItemInfo.Reset();
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::HideRootFolder
//
// -----------------------------------------------------------------------------
//
void CMediaFileDialogState::HideRootFolder( TInt aFolderId, TBool aHidden,
                                            const TDesC& aText, TInt aIconId )
    {
    TInt index = IndexFromId( aFolderId );
    TMFListItem& item = iList[index];
    if ( item.iParentFolderId != EEFolderRoot )
        {
        return; // only root folders can be variated
        }

    item.iHidden = aHidden;
    if ( aText != KNullDesC )
        {
        TMFDialogUtil::StrCopy( item.iText, aText );
        }
    if ( aIconId != KErrNotFound )
        {
        item.iIconId = aIconId;
        }
    
    // update root folder indexes. Note that root folders must be
    // created in the same order they appear in UI (see AddPermanentItemsL).
    TInt listIndex = 0;
    TInt count = iList.Count();
    for ( TInt i=0; i<count; i++ )
        {
        TMFListItem& temp = iList[i];
        if ( temp.iParentFolderId == EEFolderRoot )
            {
            if ( !temp.iHidden )
                {
                temp.iListIndex = listIndex;
                listIndex++;
                }
            }
        }
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::ResetUnknownCount
//
// -----------------------------------------------------------------------------
//
void CMediaFileDialogState::ResetUnknownCount()
    {
    SetUnknownCount( EEFolderArtistRoot, KErrNotFound );
    SetUnknownCount( EEFolderAlbumRoot, KErrNotFound );
    SetUnknownCount( EEFolderGenreRoot, KErrNotFound );
    SetUnknownCount( EEFolderComposerRoot, KErrNotFound );
    SetUnknownCount( EEFolderArtist, KErrNotFound );
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::SetUnknownCount
//
// -----------------------------------------------------------------------------
//
void CMediaFileDialogState::SetUnknownCount( TInt aFolderId, TInt aCount )
    {
    TInt index = IndexFromId( aFolderId );
    TMFListItem& item = iList[index];
    item.iUnknownCount = aCount;
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::UnknownCount
//
// -----------------------------------------------------------------------------
//
TInt CMediaFileDialogState::UnknownCount( TInt aFolderId )
    {
    TInt index = IndexFromId( aFolderId );
    TMFListItem& item = iList[index];
    return item.iUnknownCount;
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::HideUnknownFolder
//
// -----------------------------------------------------------------------------
//
void CMediaFileDialogState::HideUnknownFolder( TInt aFolderId, TInt aUnknownCount )
    {
    TInt index = IndexFromId( aFolderId );
    TMFListItem& item = iList[index];
    
    item.iHidden = EFalse;
    if ( aUnknownCount < 1 )
        {
        item.iHidden = ETrue;
        }
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::HideUnknownFolders
//
// -----------------------------------------------------------------------------
//
void CMediaFileDialogState::HideUnknownFolders()
    {
    TInt count = UnknownCount( EEFolderArtistRoot );
    HideUnknownFolder( EEFolderArtistUnknown, count );
    
    count = UnknownCount( EEFolderAlbumRoot );
    HideUnknownFolder( EEFolderAlbumUnknown, count );

    count = UnknownCount( EEFolderGenreRoot );
    HideUnknownFolder( EEFolderGenreUnknown, count );

    count = UnknownCount( EEFolderComposerRoot );
    HideUnknownFolder( EEFolderComposerUnknown, count );
    
    count = UnknownCount( EEFolderArtist );
    HideUnknownFolder( EEFolderArtistAlbumUnknown, count );
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::SetUnknownFolderPosition
//
// -----------------------------------------------------------------------------
//
void CMediaFileDialogState::SetUnknownFolderPosition( TInt aQueryCount )
    {
    //
    // Unknown folder is the last list item (after query result items)
    //
    if ( iCurrentFolderId == EEFolderArtistRoot|| 
         iCurrentFolderId == EEFolderAlbumRoot ||
         iCurrentFolderId == EEFolderGenreRoot ||
         iCurrentFolderId == EEFolderComposerRoot ||
         iCurrentFolderId == EEFolderArtist )
        {
        SetListIndex( EEFolderArtistUnknown, aQueryCount );
        SetListIndex( EEFolderAlbumUnknown, aQueryCount );
        SetListIndex( EEFolderGenreUnknown, aQueryCount );
        SetListIndex( EEFolderComposerUnknown, aQueryCount );
    
        // folder EEFolderArtist has persistent "All" folder as a first item
        SetListIndex( EEFolderArtistAlbumUnknown, aQueryCount + 1 );
        }
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::IndexFromId
//
// -----------------------------------------------------------------------------
//
TInt CMediaFileDialogState::IndexFromId( TInt aFolderId )
    {
    TInt index = KErrNotFound;
    
    TInt count = iList.Count();
    for (TInt i=0; i<count; i++)
        {
        TMFListItem& item = iList[i];
        if ( item.iFolderId == aFolderId )
            {
            index = i;
            break;
            }
        }
        
    __ASSERT_ALWAYS( index != KErrNotFound, Panic( KErrGeneral ) );
    
    return index;
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::PersistentFolderCount
//
// Get count of persistent subfolders in folder aFolderId.
// -----------------------------------------------------------------------------
//
TInt CMediaFileDialogState::PersistentFolderCount( TInt aFolderId )
    {
    TInt folderCount = 0;
    
    TInt count = iList.Count();
    for ( TInt i=0; i<count; i++ )
        {
        TMFListItem& item = iList[i];
        if ( item.iParentFolderId == aFolderId )
            {
            if ( item.iHidden )
                {
                continue;
                }
            if ( item.iPersistent )
                {
                folderCount++;
                }
            }
        }

    return folderCount;
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::PersistentFolderCount
//
// -----------------------------------------------------------------------------
//
TInt CMediaFileDialogState::PersistentFolderCount()
    {
    return PersistentFolderCount( iCurrentFolderId );
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::LeadingPersistentFolderCount
//
// -----------------------------------------------------------------------------
//
TInt CMediaFileDialogState::LeadingPersistentFolderCount()
    {
    // how many persisten folders in the beginning of list
    if ( iCurrentFolderId == EEFolderArtist )
        {
        return 1;
        }
        
    return 0;    
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::CurrentItemIndex
//
// -----------------------------------------------------------------------------
//
TInt CMediaFileDialogState::CurrentItemIndex()
    {
    return iListPosition;
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::SetCurrentItemIndex
//
// -----------------------------------------------------------------------------
//
void CMediaFileDialogState::SetCurrentItemIndex( TInt aIndex )
    {
    iListPosition = aIndex;
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::PreviousFolderId
//
// -----------------------------------------------------------------------------
//
TInt CMediaFileDialogState::PreviousFolderId()
    {
    return iPreviousFolderId;
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::GetCurrentItemInfo
//
// -----------------------------------------------------------------------------
//
TMFCurrentItemInfo& CMediaFileDialogState::CurrentItemInfo()
    {
    return iCurrentItemInfo;
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::QueryDirection
//
// -----------------------------------------------------------------------------
//
TInt CMediaFileDialogState::QueryDirection()
    {
    return iQueryDirection;
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::IsPersistent
//
// -----------------------------------------------------------------------------
//
TInt CMediaFileDialogState::IsPersistent( TInt aFolderId )
    {
    TInt index = IndexFromId( aFolderId );

    TMFListItem& item = iList[index];
    return item.iPersistent;
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::SetListIndex
//
// -----------------------------------------------------------------------------
//
void CMediaFileDialogState::SetListIndex( TInt aFolderId, TInt aListIndex )
    {
    TInt count = iList.Count();
    for ( TInt i=0; i<count; i++ )
        {
        TMFListItem& item = iList[i];
        if ( item.iFolderId == aFolderId )
            {
            if ( item.iParentFolderId == EEFolderRoot || 
                 item.iParentFolderId == EEFolderMusic )
                {
                // root and music folder indexes cannot change after initialization
                break;
                }
            item.iListIndex = aListIndex;
            break;
            }
        }
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::ListIndex
//
// -----------------------------------------------------------------------------
//
TInt CMediaFileDialogState::ListIndex( TInt aFolderId )
    {
    TInt count = iList.Count();
    for ( TInt i=0; i<count; i++ )
        {
        TMFListItem& item = iList[i];
        if ( item.iFolderId == aFolderId )
            {
            return item.iListIndex;
            }
        }
    
    return KErrNotFound;
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::FindBoxNeeded
//
// -----------------------------------------------------------------------------
//
TBool CMediaFileDialogState::FindBoxNeeded()
    {
    //return ETrue;  // find box used in every folder
    
    
    if ( iCurrentFolderId == EEFolderSearch ||
         iCurrentFolderId == EEFolderRoot )
        {
        return ETrue; // these folders have find box
        }
    
    TMFListItem& currentFolder = iList[iCurrentFolderIndex];
    if ( currentFolder.iChildFolderId == EEFolderNone )
        {
        return ETrue; // folder contains audio or fideo files
        }
        
    return EFalse;
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::QueryNeeded
//
// -----------------------------------------------------------------------------
//
TBool CMediaFileDialogState::QueryNeeded()
    {
    return QueryNeeded( iCurrentFolderId );
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::QueryNeeded
//
// -----------------------------------------------------------------------------
//
TBool CMediaFileDialogState::QueryNeeded( TInt aFolderId )
    {
    if ( aFolderId == EEFolderRoot || aFolderId == EEFolderMusic )
        {
        return EFalse;
        }
    return ETrue;
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::SetText
//
// -----------------------------------------------------------------------------
//
void CMediaFileDialogState::SetText( TInt aFolderId, const TDesC& aText )
    {
    TInt index = IndexFromId( aFolderId );

    TMFListItem& item = iList[index];
    
    // persistent folder data cannot change after initialization
    if ( !item.iPersistent )
        {
        TMFDialogUtil::StrCopy( item.iText, aText);
        }
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::GetText
//
// -----------------------------------------------------------------------------
//
void CMediaFileDialogState::GetText( TInt aFolderId, TDes& aText )
    {
    aText = KNullDesC;
    
    TInt index = IndexFromId( aFolderId );

    TMFListItem& item = iList[index];
    TMFDialogUtil::StrCopy( aText, item.iText );
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::GetSearchTitleL
//
// -----------------------------------------------------------------------------
//
void CMediaFileDialogState::GetSearchTitleL( TDes& aText, TInt aCount )
    {
    aText = KNullDesC;
    
    HBufC* hBuf = StringLoader::LoadLC( R_QTN_VIEW_SEARCH, aCount );
    TMFDialogUtil::StrCopy( aText, *hBuf );
    CleanupStack::PopAndDestroy( hBuf );
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::GetSearchTitle
//
// -----------------------------------------------------------------------------
//
void CMediaFileDialogState::GetSearchTitle( TDes& aText, TInt aCount )
    {
    TRAP_IGNORE( GetSearchTitleL( aText, aCount ) );
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::GetTitle
//
// -----------------------------------------------------------------------------
//
void CMediaFileDialogState::GetTitle( TInt aFolderId, TDes& aText )
    {
    aText = KNullDesC;
     
    TInt index = IndexFromId( aFolderId );

    TMFListItem& item = iList[index];
    TMFDialogUtil::StrCopy( aText, item.iTitle );
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::SetTitle
//
// -----------------------------------------------------------------------------
//
void CMediaFileDialogState::SetTitle( TInt aFolderId, const TDesC& aText )
    {
    TInt index = IndexFromId( aFolderId );

    TMFListItem& item = iList[index];
    
    // persistent folder data cannot change after initialization
    if ( !item.iPersistent )
        {
        TMFDialogUtil::StrCopy( item.iTitle, aText);
        }
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::CurrentFolder
//
// -----------------------------------------------------------------------------
//
TInt CMediaFileDialogState::CurrentFolder()
    {
    return iCurrentFolderId;
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::SetCurrentFolder
//
// -----------------------------------------------------------------------------
//
void CMediaFileDialogState::SetCurrentFolder( TInt aFolderId )
    {
    iCurrentFolderIndex = IndexFromId( aFolderId );
    iCurrentFolderId = aFolderId;
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::SetStateAfterQuery
//
// Set media file list state. This should be called after successful
// database query.
// -----------------------------------------------------------------------------
//
void CMediaFileDialogState::SetStateAfterQuery()
    {
    if ( iQueryDirection == EEQueryUpdate )
        {
        return;  // state does not change when updating
        }
    
    if ( iQueryDirection == EEQueryDown )
        {
        iListPosition = 0;
        }
    if ( iQueryDirection == EEQueryUp )
        {
        // set list position to folder that was closed
        TInt index = IndexFromId( iCurrentFolderId );
        TMFListItem& item = iList[index];
        iListPosition = item.iListIndex;
        }
    
    iPreviousFolderId = iCurrentFolderId;
    SetCurrentFolder( iQueryFolderId );
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::SetQueryInfo
//
// -----------------------------------------------------------------------------
//
void CMediaFileDialogState::SetQueryInfo( TInt aQueryFolderId, const TDesC& aQueryText,
                                          TInt aQueryListPosition, TInt aQueryDirection )
    {
    if ( aQueryDirection == EEQueryUpdate )
        {
        iQueryDirection = aQueryDirection;
        return;
        }
    
    if ( aQueryDirection == EEQueryDown )
        {
        // folder/title updated even is query is not successful
        SetText( aQueryFolderId, aQueryText );
        SetTitle( aQueryFolderId, aQueryText );
        
        // set folder list position so that it can be restored
        // when folder is closed
        SetListIndex( aQueryFolderId, aQueryListPosition );
        }
       
    
    iQueryDirection = aQueryDirection;
    
    // new list position set after successful query
    iListPosition = aQueryListPosition;
    
    // iCurrentFolderId set after successful query
    iQueryFolderId = aQueryFolderId;
    }

/*
void CMediaFileDialogState::SetStateAfterQuery()
    {
    TInt previousCurrentFolderId = iCurrentFolderId;
    
    SetCurrentFolder( iQueryFolderId );
    
    if ( iQueryDirection == EEQueryDown )
        {
        SetListIndex( iQueryFolderId, iQueryListPosition );
        iListPosition = 0;
        }
    if ( iQueryDirection == EEQueryUp )
        {
        // set list position to folder that was closed
        TInt index = IndexFromId( previousCurrentFolderId );
        TMFListItem& item = iList[index];
        iListPosition = item.iListIndex;
        }
    }
*/



/*
void CMediaFileDialogState::SetQueryInfo( TInt aQueryFolderId, const TDesC& aQueryText,
                                          TInt aQueryListPosition, TInt aQueryDirection )
    {
    iQueryFolderId = aQueryFolderId;
    if ( aQueryDirection == EEQueryDown )
        {
        // folder/title updated even is query is not successful
        SetText( aQueryFolderId, aQueryText );
        SetTitle( aQueryFolderId, aQueryText );
        }
       
    iQueryListPosition = aQueryListPosition;
    iQueryDirection = aQueryDirection;
    
    iListPosition = aQueryListPosition; // updated after successful query
    }
*/

// -----------------------------------------------------------------------------
// CMediaFileDialogState::NextFolderDown
//
// -----------------------------------------------------------------------------
//
TInt CMediaFileDialogState::NextFolderDown( TInt aListIndex )
    {
    TInt folderId = FolderId( aListIndex );
    
    // folderId is KErrNotFound if list item is not a folder
    return folderId;
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::NextFolderUp
//
// -----------------------------------------------------------------------------
//
TInt CMediaFileDialogState::NextFolderUp()
    {
    TMFListItem& item = iList[iCurrentFolderIndex];
    
    if ( item.iParentFolderId != KErrNotFound )
        {
        return item.iParentFolderId;
        }
        
    return KErrNotFound;
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::QueryFolder
//
// -----------------------------------------------------------------------------
//
TInt CMediaFileDialogState::QueryFolder()
    {
    return iQueryFolderId;
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::FolderId
//
// -----------------------------------------------------------------------------
//
TInt CMediaFileDialogState::FolderId( TInt aListIndex )
    {
    TBool persistent = EFalse;
    TInt icon = EEIconEmpty;
    TInt id = KErrNotFound;
    TBuf<KBufSize64> buf;
    GetFolderInfo( aListIndex, id, buf, persistent, icon );
    
    return id;
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::FolderIndex
//
// -----------------------------------------------------------------------------
//
TInt CMediaFileDialogState::FolderIndex( TInt aListIndex )
    {
    if ( aListIndex < 0 )
        {
        return KErrNotFound;
        }

    TInt folderIndex = KErrNotFound;
    
    TInt count = iList.Count();
    for ( TInt i=0; i<count; i++ )
        {
        TMFListItem& item = iList[i];
        if ( item.iParentFolderId == iCurrentFolderId )
            {
            if ( item.iHidden )
                {
                continue;
                }
            if ( item.iListIndex == aListIndex && item.iPersistent )
                {
                folderIndex = i;
                break;
                }
            }
        }
    
    return folderIndex;
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::GetFolderInfo
//
// -----------------------------------------------------------------------------
//
void CMediaFileDialogState::GetFolderInfo( TInt aListIndex, TInt& aId, TDes& aText,
                                           TBool& aPersistent, TInt& aIconId )
    {
    aId = KErrNotFound;
    aText = KNullDesC;
    aPersistent = EFalse;
    aIconId = EEIconEmpty;
    
    TMFListItem& currentFolder = iList[iCurrentFolderIndex];
    if ( currentFolder.iChildFolderId == EEFolderNone )
        {
        // this is optimization and is based on the the fact that a folder
        // cannot contain both folder items and audio/video items.
        
        return; // not folder (item is audio or video file)
        }
    
    TInt index = FolderIndex( aListIndex );
    if ( index != KErrNotFound )
        {
        // get persistent folder info
        TMFListItem& item = iList[index];
        TMFDialogUtil::StrCopy( aText, item.iText );
        aId = item.iFolderId;
        aPersistent = ETrue;
        aIconId = item.iIconId;
        }
    else
        {
        // get non-persistent folder info.
        // folder text (eg album name) is in database
        aId = currentFolder.iChildFolderId;
        aIconId = currentFolder.iChildIconId;
        }
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::EnableNullItemL
//
// -----------------------------------------------------------------------------
//
void CMediaFileDialogState::EnableNullItemL( TInt aFolderId, const TDesC& aText,
                                              TInt aIconId  )
    {
    HideRootFolder( aFolderId, EFalse, aText, aIconId );
    }



// -----------------------------------------------------------------------------
// CMediaFileDialogState::AddPermanentItemsL
//
//
// Root
//   Downloads
//   Tones
//     <tone1>
//   Music
//     All
//     Artist
//       <artist1>
//       <artist2>
//         All
//         <album1>
//         <album2>
//         Unknown
//       Unknown
//     Album
//       <album1>
//         <song1>
//       <album2>
//       Unknown
//         <song1>
//         <song2>
//     Genre
//       Unknown
//     Composer
//       Unknown
//   Videos
//     <video1>
//     <video2>
//   Recordings
//      <recording1>
//      <recording2>
//
// -----------------------------------------------------------------------------
//
void CMediaFileDialogState::AddPermanentItemsL()
    {
    TMFListItem item;
    
    // Root
    item.iListIndex = 0;
    item.iFolderId = EEFolderRoot;
    item.iParentFolderId = KErrNotFound;
    item.iChildFolderId = KErrNotFound;
    item.iPersistent = ETrue;
    item.iHidden = EFalse;
    item.iIconId = KErrNotFound;
    item.iChildIconId = KErrNotFound;
    item.iUnknownCount = KErrNotFound;
    StringLoader::Load( item.iText, R_QTN_MEDIA_FILE_DIALOG_TITLE );
    item.iTitle = KNullDesC;
    User::LeaveIfError( iList.Append( item ) );

    // Downloads
    item.iListIndex = 0;
    item.iFolderId = EEFolderDownload;
    item.iParentFolderId = EEFolderRoot;
    item.iChildFolderId = EEFolderNone;
    item.iPersistent = ETrue;
    item.iHidden = EFalse;
    item.iIconId = EEIconFolderDownload;
    item.iChildIconId = EEIconEmpty;
    item.iUnknownCount = KErrNotFound;
    StringLoader::Load( item.iText, R_QTN_FOLDER_DOWNLOAD );
    item.iTitle = KNullDesC;
    User::LeaveIfError( iList.Append( item ) );

    // Tones
    item.iListIndex = 1;
    item.iFolderId = EEFolderTones;
    item.iParentFolderId = EEFolderRoot;
    item.iChildFolderId = EEFolderNone;
    item.iPersistent = ETrue;
    item.iHidden = EFalse;
    item.iIconId = EEIconFolder;
    item.iChildIconId = EEIconTone;
    item.iUnknownCount = KErrNotFound;
    StringLoader::Load( item.iText, R_QTN_FOLDER_TONES );
    StringLoader::Load( item.iTitle, R_QTN_VIEW_TONES );
    User::LeaveIfError( iList.Append( item ) );
    
    // Music
    item.iListIndex = 2;
    item.iFolderId = EEFolderMusic;
    item.iParentFolderId = EEFolderRoot;
    item.iChildFolderId = KErrNotFound;
    item.iPersistent = ETrue;
    item.iHidden = EFalse;
    item.iIconId = EEIconFolder;
    item.iChildIconId = KErrNotFound;
    item.iUnknownCount = KErrNotFound;
    StringLoader::Load( item.iText, R_QTN_FOLDER_MUSIC );
    StringLoader::Load( item.iTitle, R_QTN_VIEW_MUSIC );
    User::LeaveIfError( iList.Append( item ) );

    // Videos
    item.iListIndex = 3;
    item.iFolderId = EEFolderVideos;
    item.iParentFolderId = EEFolderRoot;
    item.iChildFolderId = EEFolderNone;
    item.iPersistent = ETrue;
    item.iHidden = EFalse;
    item.iIconId = EEIconFolder;
    item.iChildIconId = EEIconVideo;
    item.iUnknownCount = KErrNotFound;
    StringLoader::Load( item.iText, R_QTN_FOLDER_VIDEOS );
    StringLoader::Load( item.iTitle, R_QTN_VIEW_VIDEOS );
    User::LeaveIfError( iList.Append( item ) );
    
    // Recordings
    item.iListIndex = 4;
    item.iFolderId = EEFolderRecordings;
    item.iParentFolderId = EEFolderRoot;
    item.iChildFolderId = EEFolderNone;    
    item.iPersistent = ETrue;
    item.iHidden = EFalse;
    item.iIconId = EEIconFolder;
    item.iChildIconId = EEIconFolder;
    item.iUnknownCount = KErrNotFound;
    StringLoader::Load( item.iText, R_QTN_FOLDER_RECORDINGS );
    StringLoader::Load( item.iTitle, R_QTN_VIEW_RECORDINGS );
    User::LeaveIfError( iList.Append( item ) );

    // Null item one
    item.iListIndex = 5;
    item.iFolderId = EEFolderNullItemOne;
    item.iParentFolderId = EEFolderRoot;
    item.iChildFolderId = EEFolderNone;
    item.iPersistent = ETrue;
    item.iHidden = ETrue;  // by default not visible
    item.iIconId = EEIconEmpty;
    item.iChildIconId = KErrNotFound;
    item.iUnknownCount = KErrNotFound;
    item.iText = KNullDesC;
    item.iTitle = KNullDesC;
    User::LeaveIfError( iList.Append( item ) );
    
    // Null item two
    item.iListIndex = 6;
    item.iFolderId = EEFolderNullItemTwo;
    item.iParentFolderId = EEFolderRoot;
    item.iChildFolderId = KErrNotFound;
    item.iPersistent = ETrue;
    item.iHidden = ETrue;  // by default not visible
    item.iIconId = EEIconEmpty;
    item.iChildIconId = KErrNotFound;
    item.iUnknownCount = KErrNotFound;
    item.iText = KNullDesC;
    item.iTitle = KNullDesC;
    User::LeaveIfError( iList.Append( item ) );

    // Search
    item.iListIndex = KErrNotFound;
    item.iFolderId = EEFolderSearch;
    item.iParentFolderId = EEFolderRoot;
    item.iChildFolderId = EEFolderNone;    
    item.iPersistent = ETrue;
    item.iHidden = ETrue;  // visible only when search is used in root level
    item.iIconId = EEIconEmpty;
    item.iChildIconId = KErrNotFound;
    item.iUnknownCount = KErrNotFound;
    item.iText = KNullDesC;
    item.iTitle = KNullDesC;

    //StringLoader::Load( item.iText, R_QTN_VIEW_SEARCH );
    //StringLoader::Load( item.iTitle, R_QTN_VIEW_SEARCH );
    User::LeaveIfError( iList.Append( item ) );


    // Music Search
    item.iListIndex = KErrNotFound;
    item.iFolderId = EEFolderSearchMusic;
    item.iParentFolderId = EEFolderMusic;
    item.iChildFolderId = EEFolderNone;    
    item.iPersistent = ETrue;
    item.iHidden = ETrue;  // visible only when search is used in root level
    item.iIconId = EEIconEmpty;
    item.iChildIconId = KErrNotFound;
    item.iUnknownCount = KErrNotFound;
    item.iText = KNullDesC;
    item.iTitle = KNullDesC;
    User::LeaveIfError( iList.Append( item ) );

    // All music
    item.iListIndex = 0;
    item.iFolderId = EEFolderAllMusic;
    item.iParentFolderId = EEFolderMusic;
    item.iChildFolderId = EEFolderNone;    
    item.iPersistent = ETrue;
    item.iHidden = EFalse;
    item.iIconId = EEIconFolder;
    item.iChildIconId = EEIconMusic;
    item.iUnknownCount = KErrNotFound;
    StringLoader::Load( item.iText, R_QTN_FOLDER_ALL_MUSIC );
    StringLoader::Load( item.iTitle, R_QTN_FOLDER_ALL_MUSIC );
    User::LeaveIfError( iList.Append( item ) );
    

    // Artist Root
    item.iListIndex = 1;
    item.iFolderId = EEFolderArtistRoot;
    item.iParentFolderId = EEFolderMusic;
    item.iChildFolderId = EEFolderArtist;
    item.iPersistent = ETrue;
    item.iHidden = EFalse;
    item.iIconId = EEIconFolder;
    item.iChildIconId = EEIconArtist;
    item.iUnknownCount = KErrNotFound;
    StringLoader::Load( item.iText, R_QTN_FOLDER_ARTIST );
    StringLoader::Load( item.iTitle, R_QTN_VIEW_ARTIST );
    User::LeaveIfError( iList.Append( item ) );

    // Album Root
    item.iListIndex = 2;
    item.iFolderId = EEFolderAlbumRoot;
    item.iParentFolderId = EEFolderMusic;
    item.iChildFolderId = EEFolderAlbum;
    item.iPersistent = ETrue;
    item.iHidden = EFalse;
    item.iIconId = EEIconFolder;
    item.iChildIconId = EEIconAlbum;
    item.iUnknownCount = KErrNotFound;
    StringLoader::Load( item.iText, R_QTN_FOLDER_ALBUM );
    StringLoader::Load( item.iTitle, R_QTN_VIEW_ALBUM );
    User::LeaveIfError( iList.Append( item ) );
    
    // Genre Root
    item.iListIndex = 3;
    item.iFolderId = EEFolderGenreRoot;
    item.iParentFolderId = EEFolderMusic;
    item.iChildFolderId = EEFolderGenre;
    item.iPersistent = ETrue;
    item.iHidden = EFalse;
    item.iIconId = EEIconFolder;
    item.iChildIconId = EEIconGenre;
    item.iUnknownCount = KErrNotFound;
    StringLoader::Load( item.iText, R_QTN_FOLDER_GENRE );
    StringLoader::Load( item.iTitle, R_QTN_VIEW_GENRE );
    User::LeaveIfError( iList.Append( item ) );
    
    // Composer Root
    item.iListIndex = 4;
    item.iFolderId = EEFolderComposerRoot;
    item.iParentFolderId = EEFolderMusic;
    item.iChildFolderId = EEFolderComposer;
    item.iPersistent = ETrue;
    item.iHidden = EFalse;
    item.iIconId = EEIconFolder;
    item.iChildIconId = EEIconComposer;
    item.iUnknownCount = KErrNotFound;
    StringLoader::Load( item.iText, R_QTN_FOLDER_COMPOSER );
    StringLoader::Load( item.iTitle, R_QTN_VIEW_COMPOSER );
    User::LeaveIfError( iList.Append( item ) );

    // Album ( represents some album under EEFolderAlbumRoot )
    item.iListIndex = KErrNotFound;
    item.iFolderId = EEFolderAlbum;
    item.iParentFolderId = EEFolderAlbumRoot;
    item.iChildFolderId = EEFolderNone;
    item.iPersistent = EFalse;
    item.iHidden = EFalse;
    item.iIconId = EEIconAlbum;
    item.iChildIconId = EEIconMusic;
    item.iUnknownCount = KErrNotFound;
    item.iText = KNullDesC;
    item.iTitle = KNullDesC;
    User::LeaveIfError( iList.Append( item ) );

    // Album Unknown ( all music files without album attribute )
    item.iListIndex = KErrNotFound;
    item.iFolderId = EEFolderAlbumUnknown;
    item.iParentFolderId = EEFolderAlbumRoot;
    item.iChildFolderId = EEFolderNone;
    item.iPersistent = ETrue;
    item.iHidden = EFalse;
    item.iIconId = EEIconUnknown;
    item.iChildIconId = EEIconMusic;
    item.iUnknownCount = KErrNotFound;
    StringLoader::Load( item.iText, R_QTN_UNKNOWN_ALBUM );
    StringLoader::Load( item.iTitle, R_QTN_UNKNOWN_ALBUM );
    User::LeaveIfError( iList.Append( item ) );
    
    // Genre ( represents some genre under EEFolderGenreRoot )
    item.iListIndex = KErrNotFound;
    item.iFolderId = EEFolderGenre;
    item.iParentFolderId = EEFolderGenreRoot;
    item.iChildFolderId = EEFolderNone;
    item.iPersistent = EFalse;
    item.iHidden = EFalse;
    item.iIconId = EEIconGenre;
    item.iChildIconId = EEIconMusic;
    item.iUnknownCount = KErrNotFound;
    item.iText = KNullDesC;
    item.iTitle = KNullDesC;
    User::LeaveIfError( iList.Append( item ) );

    // Genre Unknown ( all music files without genre attribute )
    item.iListIndex = KErrNotFound;
    item.iFolderId = EEFolderGenreUnknown;
    item.iParentFolderId = EEFolderGenreRoot;
    item.iChildFolderId = EEFolderNone;
    item.iPersistent = ETrue;
    item.iHidden = EFalse;
    item.iIconId = EEIconUnknown;
    item.iChildIconId = EEIconMusic;
    item.iUnknownCount = KErrNotFound;
    StringLoader::Load( item.iText, R_QTN_UNKNOWN_GENRE );
    StringLoader::Load( item.iTitle, R_QTN_UNKNOWN_GENRE );
    User::LeaveIfError( iList.Append( item ) );
    
    // Composer ( represents some composer under EEFolderComposerRoot )
    item.iListIndex = KErrNotFound;
    item.iFolderId = EEFolderComposer;
    item.iParentFolderId = EEFolderComposerRoot;
    item.iChildFolderId = EEFolderNone;
    item.iPersistent = EFalse;
    item.iHidden = EFalse;
    item.iIconId = EEIconComposer;
    item.iChildIconId = EEIconMusic;
    item.iUnknownCount = KErrNotFound;
    item.iText = KNullDesC;
    item.iTitle = KNullDesC;
    User::LeaveIfError( iList.Append( item ) );

    // Composer Unknown ( all music files without composer attribute )
    item.iListIndex = KErrNotFound;
    item.iFolderId = EEFolderComposerUnknown;
    item.iParentFolderId = EEFolderComposerRoot;
    item.iChildFolderId = EEFolderNone;
    item.iPersistent = ETrue;
    item.iHidden = EFalse;
    item.iIconId = EEIconUnknown;
    item.iChildIconId = EEIconMusic;
    item.iUnknownCount = KErrNotFound;
    StringLoader::Load( item.iText, R_QTN_UNKNOWN_COMPOSER );
    StringLoader::Load( item.iTitle, R_QTN_UNKNOWN_COMPOSER );
    User::LeaveIfError( iList.Append( item ) );



    //
    // folders under Artist root
    //
    
    // Artist (artist folder, folder name is artist name)
    item.iListIndex = KErrNotFound;
    item.iFolderId = EEFolderArtist;
    item.iParentFolderId = EEFolderArtistRoot;
    item.iChildFolderId = EEFolderArtistAlbum;
    item.iPersistent = EFalse;
    item.iHidden = EFalse;
    item.iIconId = EEIconArtist;
    item.iChildIconId = EEIconAlbum;
    item.iUnknownCount = KErrNotFound;
    item.iText = KNullDesC;
    item.iTitle = KNullDesC;
    User::LeaveIfError( iList.Append( item ) );

    // Artist all (all music files for one artist)
    item.iListIndex = 0;
    item.iFolderId = EEFolderArtistAll;
    item.iParentFolderId = EEFolderArtist;
    item.iChildFolderId = EEFolderNone;
    item.iPersistent = ETrue;
    item.iHidden = EFalse;
    item.iIconId = EEIconFolder;
    item.iChildIconId = EEIconMusic;
    item.iUnknownCount = KErrNotFound;
    StringLoader::Load( item.iText, R_QTN_FOLDER_ARTIST_ALL );
    StringLoader::Load( item.iTitle, R_QTN_FOLDER_ARTIST_ALL );
    User::LeaveIfError( iList.Append( item ) );

    // Artist album (one album, folder name is album name)
    item.iListIndex = KErrNotFound;
    item.iFolderId = EEFolderArtistAlbum;
    item.iParentFolderId = EEFolderArtist;
    item.iChildFolderId = EEFolderNone;
    item.iPersistent = EFalse;
    item.iHidden = EFalse;
    item.iIconId = EEIconAlbum;
    item.iChildIconId = EEIconMusic;
    item.iUnknownCount = KErrNotFound;
    item.iText = KNullDesC;
    item.iTitle = KNullDesC;
    User::LeaveIfError( iList.Append( item ) );

    // Artist album unknown (music files for one artist without album attribute)
    item.iListIndex = KErrNotFound;
    item.iFolderId = EEFolderArtistAlbumUnknown;
    item.iParentFolderId = EEFolderArtist;
    item.iChildFolderId = EEFolderNone;
    item.iPersistent = ETrue;
    item.iHidden = EFalse;
    item.iIconId = EEIconUnknown;
    item.iChildIconId = EEIconMusic;
    item.iUnknownCount = KErrNotFound;
    StringLoader::Load( item.iText, R_QTN_UNKNOWN_ALBUM );
    StringLoader::Load( item.iTitle, R_QTN_UNKNOWN_ALBUM );
    User::LeaveIfError( iList.Append( item ) );

    // Artist unknown (all music files without artist attribute)
    item.iListIndex = KErrNotFound;
    item.iFolderId = EEFolderArtistUnknown;
    item.iParentFolderId = EEFolderArtistRoot;
    item.iChildFolderId = EEFolderNone;
    item.iPersistent = ETrue;
    item.iHidden = EFalse;
    item.iIconId = EEIconUnknown;
    item.iChildIconId = EEIconMusic;
    item.iUnknownCount = KErrNotFound;
    StringLoader::Load( item.iText, R_QTN_UNKNOWN_ARTIST );
    StringLoader::Load( item.iTitle, R_QTN_UNKNOWN_ARTIST );
    User::LeaveIfError( iList.Append( item ) );
    }



// -----------------------------------------------------------------------------
// CMediaFileDialogState::Panic
//
// -----------------------------------------------------------------------------
//
void CMediaFileDialogState::Panic( TInt aReason ) 
    {
	_LIT( KPanicCategory, "CMediaFileDialogState" );
	
	User::Panic( KPanicCategory, aReason ); 
    }


// -----------------------------------------------------------------------------
// CMediaFileDialogState::PrintCurrentFolder (test code)
//
// -----------------------------------------------------------------------------
//
void CMediaFileDialogState::PrintCurrentFolder()
    {
	TBuf<KBufSize128> buf;
	
	GetFolderTypeText( buf, iCurrentFolderId );
	User::InfoPrint( buf );
    }
		
		
// -----------------------------------------------------------------------------
// CMediaFileDialogState::GetFolderTypeText (test code)
//
// -----------------------------------------------------------------------------
//
void CMediaFileDialogState::GetFolderTypeText(TDes& aText, TInt aType)
    {
	switch (aType)
		{
		case EEFolderRoot:
			aText = _L("EFolderRoot");
			break;
		case EEFolderTones:
			aText = _L("EFolderTones");
			break;
		case EEFolderMusic:
			aText = _L("EFolderMusic");
			break;
		case EEFolderVideos:
			aText = _L("EFolderVideos");
			break;
		case EEFolderRecordings:
			aText = _L("EFolderRecordings");
			break;
        case EEFolderSearch:
            aText = _L("EEFolderSearch");
            break;

		case EEFolderRecent:
			aText = _L("EFolderRecent");
			break;
		

		case EEFolderArtistRoot:
			aText = _L("EFolderArtistRoot");
			break;
		case EEFolderArtist:
			aText = _L("EFolderArtist");
			break;
		case EEFolderArtistUnknown:
			aText = _L("EFolderArtistUnknown");
			break;
		case EEFolderArtistAll:
			aText = _L("EEFolderArtistAll");
	        break;
    	case EEFolderArtistAlbum:
			aText = _L("EEFolderArtistAlbum");
			break;
		case EEFolderArtistAlbumUnknown:
			aText = _L("EEFolderArtistAlbumUnknown");
			break;


		case EEFolderAllMusic:
			aText = _L("EFolderAllMusic");
			break;

		case EEFolderAlbumRoot:
			aText = _L("EFolderAlbumRoot");
			break;
		case EEFolderAlbum:
			aText = _L("EFolderAlbum");
			break;
		case EEFolderAlbumUnknown:
			aText = _L("EFolderAlbumUnknown");
			break;
			
		case EEFolderGenreRoot:
			aText = _L("EFolderGenreRoot");
			break;
		case EEFolderGenre:
			aText = _L("EFolderGenre");
			break;
		case EEFolderGenreUnknown:
			aText = _L("EFolderGenreUnknown");
			break;
			
		case EEFolderComposerRoot:
			aText = _L("EFolderComposerRoot");
			break;
		case EEFolderComposer:
			aText = _L("EFolderComposer");
			break;
		case EEFolderComposerUnknown:
			aText = _L("EFolderComposerUnknown");
			break;
			
		case EEFolderUnknown:
			aText = _L("EFolderUnknown");
			break;

		case EEFolderNone:
			aText = _L("EFolderNone");
			break;

		default:
			aText = _L("### unknown ###");
			break;
		}
    }







//  End of File