voiceui/vcommand/inc/uiarraysgenerator.h
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:29:17 +0100
branchRCL_3
changeset 19 e36f3802f733
parent 0 bf1d17376201
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:  
*
*/


#ifndef UIARRAYSGENERATOR_H
#define UIARRAYSGENERATOR_H

#include <e32base.h>

class CAknIconArray;
class CDesC16ArrayFlat;
class CVCModel;
class CGulIcon;

/**
 * Encapsulates the listbox element. Including icon, first and second line of the text
 */
class CUiEntryData : public CBase
	{
	public:
        /**
         * @param aIcon. Ownership is tranfered. I.e. the icon will be destroyed,
         *        when this object is destroyed
         * @param aFirstLine
         * @param aSecondLine
         */
		static CUiEntryData* NewL( CGulIcon* aIcon, const TDesC& aFirstLine, 
						         	const TDesC& aSecondLine = KNullDesC );

        static CUiEntryData* NewLC( CGulIcon* aIcon, const TDesC& aFirstLine, 
                                    const TDesC& aSecondLine = KNullDesC );
        
		virtual ~CUiEntryData();
        
        /**
         *  Compares entries alphabetically on the first line value basis. Comparison
         *  is done with the respect to the locale rules. @see TDesC16::CompareC
         * 
         *  @return 1. zero, if the two objects are equal.
         *          2. a negative value, if the first object is less than the second.
         *          3. a positive value, if the first object is greater than the second.
         */
        TInt CompareByFirstLine( const CUiEntryData& aAnotherEntry ) const;
        
        static TInt CompareByFirstLine( const CUiEntryData& entry1, const CUiEntryData& entry2 );
        
        /**
         * Returns the entry icon and tranfers the responsibility to the caller
         * I.e. after calling this method, this object is not responsible for deleting 
         * the icon anymore
         */
        CGulIcon* ReleaseIcon();
        
        const TDesC& FirstLine() const;
        
        const TDesC& SecondLine() const;
        
        /**
         * Construct a text ready to be used in the listbox
         * i.e. "<icon index>\t\FirstLine\tSecondLine"
         * @param aIconIndex Number to use before the first tab character
         */
        TDesC* ConstructListboxItemStringLC( TInt aIconIndex ) const;

    protected:
        CUiEntryData( CGulIcon* aIcon, const TDesC& aFirstLine, 
                            const TDesC& aSecondLine );

	private:
		CGulIcon* iIcon;
		const TDesC& iFirstLine;
        const TDesC& iSecondLine;
	};

class CUiArraysGenerator : public CBase
	{
	public:
		static CUiArraysGenerator* NewLC();
		
		/**
		 * Parses the model into a set of arrays required by the VCommand app ui
		 * I.e. basing on the "current folder" prepares the arrays for the listbox
		 * If "current" folder is the main one, it means including all the sub-folders and main
		 * folder commands. Otherwise, it means including all the current folder commands only
		 * 
		 * Both folders and commands are alphabetially sorted.
		 * All the target arrays are ResetAndDestroyed before the parsing
		 * 
		 * @param aSource Model to parse
		 * @param aCurrentFolderTitle KNullDesC if "curent" folder is the main one
		 * @param aIconArray icons to display in the listbox. Order is not specified
		 * @param aFolderTitles List of folder titles in the alphabetical order
		 * @param aItemIsFolder List of boolean values for all the listbox elements from top 
		 * 		  to bottom. ETrue for every folder, EFalse for every command
		 * @param aItemArray List of strings in the listbox expected 
		 * 		  format ( @see LB_SINGLE_GRAPHIC_HEADING ). Includes:
		 * 		  * a refence to the icon - zero-based index from the aIconArray
		 *        * written text of the command
		 *        * user-specified alternative text or KNullDesC if
		 * 		
		 */
		virtual void FillArraysL( const CVCModel& aSource, const TDesC& aCurrentFolderTitle,
						  CAknIconArray& aIconArray, CDesC16ArrayFlat& aFolderTitles, 
						  RArray<TBool>& aItemIsFolder, CDesC16ArrayFlat& aItemArray );
		
		/**
         * Updates a set of arrays required by the VCommand app ui to match current folder names
         * I.e. basing on the "current folder" prepares the arrays for the listbox
         * If "current" folder is the main one, it means including all the sub-folders and main
         * folder commands. Otherwise, it means including all the current folder commands only
         * 
         * Both folders and commands are alphabetially sorted.
         * 
         * @param aSource Model to parse
         * @param aCurrentFolderTitle KNullDesC if "curent" folder is the main one
         * @param aIconArray icons to display in the listbox. Order is not specified
         * @param aFolderTitles List of folder titles in the alphabetical order
         * @param aItemIsFolder List of boolean values for all the listbox elements from top 
         * 		  to bottom. ETrue for every folder, EFalse for every command
         * @param aItemArray List of strings in the listbox expected 
         * 		  format ( @see LB_SINGLE_GRAPHIC_HEADING ). Includes:
         * 		  * a refence to the icon - zero-based index from the aIconArray
         *        * written text of the command
         *        * user-specified alternative text or KNullDesC if
         * 		
         */					  
        void UpdateFolderArraysL( const CVCModel& aSource, const TDesC& aCurrentFolderTitle,
				          CAknIconArray& aIconArray, CDesC16ArrayFlat& aFolderTitles, 
				          RArray<TBool>& aItemIsFolder, CDesC16ArrayFlat& aItemArray );
						  
	protected:		
        /**
         * Create entries for all the subfolders in the given folder and sort the entries
         * alphabetically
         * @param aSource Model to parse
         * @param aCurrentFolderTitle KNullDesC for the main folder
         * @return The array of entries pushed to CS two times. First PopAndDestroy
         *         will ResetAndDestroy, the second one will delete the array itself
         */				  
		virtual RPointerArray<CUiEntryData>* ExtractFoldersAndSortLC2( const CVCModel& aSource, 
                    const TDesC& aCurrentFolderTitle = KNullDesC );

        /**
         * Create entries for all the subfolders in the given folder and sort the entries
         * alphabetically
         * @param aSource Model to parse
         * @param aCurrentFolderTitle KNullDesC for the main folder
         * @return The array of entries pushed to CS two times. First PopAndDestroy
         *         will ResetAndDestroy, the second one will delete the array itself
         */               
        virtual RPointerArray<CUiEntryData>* ExtractCommandsAndSortLC2( const CVCModel& aSource, 
                    const TDesC& aCurrentFolderTitle = KNullDesC );
        
        /**
         * Fills the arrays required by the ui side with the information from entries
         * @param aEntries Must contain folder entries only
         *        FirstLine is FolderListedName
         * @leave KErrCorrupt if in the aModel there is no command with the folder listed name
         *          from aEntries
         */                    
        virtual void FillFolderTitlesL( RArray<TBool>& aItemIsFolder, 
                    CDesC16ArrayFlat& aFolderTitles, const CVCModel& aModel,
                    const RPointerArray<CUiEntryData>& aEntries );
        
    };
	
#endif //UIARRAYSGENERATOR_H

// End of File