/*
* Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members
* which accompanies this distribution, and is available
* at the URL "http://www.symbianfoundation.org/legal/licencesv10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
*/



#if !defined(__EIKLBV_H__)
#define __EIKLBV_H__

#if !defined(__E32BASE_H__)
#include <e32base.h>
#endif

#if !defined(__GDI_H__)
#include <gdi.h>
#endif

class CListItemDrawer;
class MListBoxModel;
class CWindowGc;
class RWindowGroup;
class CWsScreenDevice;
class CWindowGc;
class RWindow;
class CListBoxViewExtension;
class CEikListBox;

//
// class MListVisibiltyObserver
//

class MListVisibilityObserver 
	{
public:
	virtual TBool IsVisible() const = 0;
	};

/**
 * List box view.
 *
 * A list box view displays the list items which are currently visible in 
 * a list box. List box views draw each of the items for display using 
 * methods defined in their associated list box drawer. 
 *
 * Together with its list item drawer, a @c CListBoxView encapsulates the 
 * on-screen appearance of data in a list box.
 *
 * List box views also encapsulate item selection, the current item, and the 
 * fundamentals of how the selection and the current item are updated according
 * to user input. Input events themselves are handled by @c CEikListBox, 
 * which calls member functions of @c CListBoxView appropriately.
 *
 * This class is sufficient for plain list box views, and may be derived from 
 * in order to provide more complex list views. @c TechView supplies and uses 
 * the classes @c CHierarchicalListBoxView and @c CSnakingListBoxView, which 
 * provide two kinds of indented list views.
 */
class CListBoxView : public CBase
	{
public:

    /**
     * Cursor movement flags. These describe the cursor movements recognised by
     * @c MoveCursorL().
     */
    enum TCursorMovement 
		{
        /** Cursors movement to next item. */
        ECursorNextItem,  	

        /** Cursors movement to previous item. */
        ECursorPreviousItem,

        /** Cursors movement to next column. */
        ECursorNextColumn,  

        /** Cursors movement to previous column. */
        ECursorPreviousColumn,  

        /** Cursors movement to previous page. */
        ECursorPreviousPage, 

        /** Cursors movement to next page. */
        ECursorNextPage,

        /** Cursors movement to the first item. */
        ECursorFirstItem,

        /** Cursors movement to the last item. */
        ECursorLastItem,

        /** Cursors movement to the next screen. */
        ECursorNextScreen,

        /** Cursors movement to the previous screen. */
        ECursorPrevScreen
        };  

    /**
     * List box view flags.
     *
     * These flags may be combined with a logical OR to get a combination of 
     * effects.
     */
	enum TFlags
		{
        /** A selection anchor exists. */
		EAnchorExists   = 0x0001,

        /** The view is emphasised. */
		EEmphasized     = 0x0002,

        /** The view is dimmed. */
		EDimmed         = 0x0004,

        /** List box view has a cursor for incremental matching. */
		EHasMatcherCursor = 0x0008,

        /** Redraw is disabled. */
		EDisableRedraw  = 0x0010,

        /** If set, selected items are painted. */
		EPaintedSelection = 0x0020,

        /** Item marking enabled. */
		EMarkSelection  = 0x0040,

        /** Item unmarking enabled. */
		EUnmarkSelection = 0x0080,

        /** Item count changes enabled. */
		EItemCountModified = 0x0100,

        /** Vertical offset has changed. */
		EOffsetChanged = 0x0200,
		};
		
    /**
     * Modes for modifying the selection.
     *
     * Changing the current item of a list box view may also affect which items
     * are selected. The selection mode of such an action describes how (or if)
     * the selection is altered by the action.
     *
     * Each function of @c CListBoxView which affects the current item is 
     * passed an appropriate selection mode by the calling input handler method
     * of @c CEikListBox. The mode is varied according to the keyboard 
     * modifiers held down by the user, or whether a pointer action was a tap 
     * or a sweep.
     *
     * Note that the behaviour of list box views may vary with the target 
     * phone due to the wide range of possible input devices. 
     * The following description assumes a phone with a pointer and a keyboard.
     */
    enum TSelectionMode 
        {
        /** 
         * The selection is not changed by actions while this is in effect, 
         * holding CTRL while pressing cursor up or down for example.
         */
        ENoSelection,
    
        /** 
         * Only a single item in the list is allowed to be selected by an 
         * action; when selecting individual items with the pointer, or 
         * moving using the cursor keys without any modifiers for example.
         */
        ESingleSelection,

        /** 
         * A single continuous run of items can be added to the selection array
         * by an action, when keyboard-selecting with the shift key held down, 
         * or when sweeping a selection with the pointer for example.
         */
        EContiguousSelection,

        /** 
         * Any single item in the list may be added to the selection by an 
         * action, when selecting or drag-selecting with the pointer when the
         * @c CTRL key is held down for example.
         */
        EDisjointSelection,

        /** 
         * Any single item in the list may be removed from the selection by an 
         * action, when unselecting for example.
         */
        EDisjointMarkSelection,

        /** 
         * Multiple items can be added to the selection array by an action, 
         * when selecting with the edit key for example.
         */
        EPenMultiselection,

        /** 
         * Mark mode is changed to @c EUnmarkSelection if item is marked or 
         * @c EMarkSelection if item is not marked by an action, when selecting
         * or unselecting item for example.
         */
        EChangeMarkMode
        };

    /** The items which are selected within a list box list. */
	typedef CArrayFix<TInt> CSelectionIndexArray;

public:

    /**
     * Destructor.
     */
	IMPORT_C ~CListBoxView();

    /**
     * C++ default constructor.
     *
     * Allocates an area of memory for a @c CListBoxView, and begins its 
     * initialisation.
     */
    IMPORT_C CListBoxView();

    /**
     * By default Symbian 2nd phase constructor is private. 
     *
     * This function completes the initialisation of a default-constructed list
     * box view. The item drawer’s graphics context is created on @c aScreen, 
     * and the list item drawer’s graphics context is set to this. See 
     * @c CListItemDrawer::SetGc().
     * 
     * @param aListBoxModel The list box model to use. 
     * @param aItemDrawer A default-constructed item drawer. 
     * @param aScreen Screen on which to display. 
     * @param aGroupWin This list box view’s window group. 
     * @param aWsWindow Window for this view. 
     * @param aDisplayArea The viewing rectangle this list box view is to use.
     * @param aItemHeight Height of a single list item. 
     */
    IMPORT_C virtual void ConstructL(MListBoxModel* aListBoxModel, 
                                     CListItemDrawer* aItemDrawer, 
                                     CWsScreenDevice* aScreen, 
                                     RWindowGroup* aGroupWin, 
                                     RWindow* aWsWindow, 
                                     const TRect& aDisplayArea, 
                                     TInt aItemHeight);

    // functions for accessing the view rect (the area of the host window in 
    // which the items are drawn)
    /**
     * Gets the list box’s view rectangle.
     *
     * @return This list box’s view rectangle.
     */
    IMPORT_C TRect ViewRect() const;

    /**
     * Sets the area within the list window in which the view can draw itself.
     * 
     * @param aRect New view rectangle.
     */
	IMPORT_C void SetViewRect(const TRect& aRect);  

	// misc. access functions for the main attributes 
    /**
     * Gets the current item’s index.
     *
     * @return Index number of the current item.
     */
	IMPORT_C virtual TInt CurrentItemIndex() const;	

    /**
     * Set the index of the current item. This function changes the current 
     * item, but does not redraw the list view or update the selection.
     *
     * @param aItemIndex Which item to make current.
     * @panic EEikPanicListBoxInvalidCurrentItemIndexSpecified Panics if the 
     *        given index is not valid. 
     */
	IMPORT_C void SetCurrentItemIndex(TInt aItemIndex); 

    /**
     * Gets the index of the item at the top of the view.
     *
     * @return The item currently displayed at the top of this list box view.
     */
	IMPORT_C TInt TopItemIndex() const;		

    /**
     * Sets the item at the top of the view by its index in the list of all 
     * items. This function also invokes @c CalcBottomItemIndex().
     *
     * @param aItemIndex Index of the item to start the view at.
     * @panic EEikPanicListBoxInvalidTopItemIndexSpecified Panics if the given
     *        index is not valid. 
     */
	IMPORT_C virtual void SetTopItemIndex(TInt aItemIndex);

    /**
     * Gets the index of the item at the bottom of this view.
     *
     * @return Index of the item at the bottom of this view.
     */
	IMPORT_C TInt BottomItemIndex() const;

    /**
     * Recalculates the index of the bottom item in the list by using the top 
     * item index and the size of the display.
     *
     * This function is called by the owning list box control when either the 
     * size of the list box or the number of items in its model changes.
     */
	IMPORT_C virtual void CalcBottomItemIndex();

    /**
     * Sets the item height.
     *
     * @param aItemHeight New item height.
     */
	IMPORT_C virtual void SetItemHeight(TInt aItemHeight);

	// functions that support incremental matching 
    /**
     * Sets the match cursor’s colour.
     *
     * @deprecated
     * @param aColor Colour in which to display the incremental match cursor.
     */
	IMPORT_C void SetMatcherCursorColor(TRgb aColor);

    /**
     * Sets the match cursor's position.
     *
     * @deprecated
     * @param aPosWithinCurrentItem Character position for the match cursor 
     *        within the current item’s string.
     */
	IMPORT_C void SetMatcherCursorPos(TInt aPosWithinCurrentItem);

    /**
     * Gets the match cursor’s position.
     *
     * @deprecated
     * @return Character position of the match cursor within the current
     *         item’s string.
     */
	IMPORT_C TInt MatcherCursorPos() const;

    /**
     * Draws the match cursor in its current screen position if the matcher 
     * cursor flag has been set.
     * 
     * This is deprecated and broken and should not be used.
     *
     * @deprecated
     */
	IMPORT_C virtual void DrawMatcherCursor();

    /**
     * Hides the matcher cursor.
     *
     * @deprecated
     */
	IMPORT_C void HideMatcherCursor();

    /**
     * Sets whether the matcher cursor flag to specify whether the match 
     * cursor is drawn.
     *
     * @deprecated
     * @param aMatcherCursor If @c ETrue, the view will draw match cursor. 
     */
	IMPORT_C void SetMatcherCursor(TBool aMatcherCursor);

    /**
     * Sets whether or not items are drawn as emphasised. 
     *
     * The function sets or resets the emphasised flag.
     *
     * @param aEmphasized If @c ETrue, this view will draw items emphasised. 
     *        If @c EFalse will not draw items emphasised.
     */
	IMPORT_C void SetEmphasized(TBool aEmphasized);

    /**
     * Sets whether items will be drawn dimmed. 
     *
     * The function sets or resets the dim flag.
     *
     * @param aDimmed If @c ETrue, this view will draw items dimmed. 
     *        If @c EFalse this view will not draw items dimmed.
     */
	IMPORT_C void SetDimmed(TBool aDimmed);

    /**
     * Disables or enables redraws.
     *
     * If this flag is set to @c ETrue, all member functions which draw items 
     * will return immediately without drawing anything. Functions which update
     * the internal state of the list box will still work, but nothing will be 
     * drawn or updated on the screen.
     *
     * @param aDisableRedraw Disables redraw if @c ETrue.
     */
	IMPORT_C void SetDisableRedraw(TBool aDisableRedraw);

    /**
     * Tests whether redraw is disabled.
     *
     * @return ETrue if redraw is disabled.
     */
	IMPORT_C TBool RedrawDisabled() const;

    /**
     * Sets the painted selection flag.
     *
     * @deprecated
     * @param aPaintedSelection If @c ETrue the painted selection flag is set 
     *        on. If @c EFalse the selection flag is set off. If NULL the 
     *        painted selection flag is cleared.
     */
	IMPORT_C void SetPaintedSelection( TBool aPaintedSelection );

	// functions that support selection
    /**
     * Gets a pointer to the selection list of this view.
     * 
     * @return Pointer to an array describing the items 
     *         in the list which are currently selected. The object pointed 
     *         at is owned by the @c CListBoxView.
     */
    IMPORT_C const CSelectionIndexArray* SelectionIndexes() const;

    /**
     * Gets a copy of the array of currently selected items. 
     * 
     * @param[in,out] aSelectionArray An instantiated @c CSelectionIndexArray.
     *                On return, contains a copy of selection indexes. 
     * @panic EEikPanicListBoxInvalidSelIndexArraySpecified Panics if the given
     *        selection index array is not valid.
     * @panic EEikPanicListBoxNoSelIndexArray Panics if selection indexes have 
     *        not been defined for this class. 
     */
	IMPORT_C void GetSelectionIndexesL(
                                CSelectionIndexArray* aSelectionArray) const;
	
    /**
     * Sets the currently selected items of this view from a selection index 
     * array.
     * 
     * @param aSelectionIndexes Items to select.
     * @panic EEikPanicListBoxInvalidSelIndexArraySpecified Panics if the given
     *        selection index array is not valid.
     */
    IMPORT_C void SetSelectionIndexesL(const CSelectionIndexArray* 
                                       aSelectionIndexes);
	
    /**
     * Resets the selection state so that there is nothing selected.
     *
     * @panic EEikPanicListBoxNoSelIndexArray Panics if selection indexes have 
     *        not been defined for this class. 
     */
    IMPORT_C void ClearSelection(); 		
	
    // select/highlight items without moving the cursor
    /**
     * Updates item selection.
     *
     * @param aSelectionMode The selection mode. 
     */
    IMPORT_C virtual void UpdateSelectionL(TSelectionMode aSelectionMode);  
    	
    /**
     * Toggles the selection of an item.
     *
     * @param aItemIndex Item to toggle.
     * @panic EEikPanicListBoxNoSelIndexArray Panics if selection indexes have 
     *        not been defined for this class. 
     */
    IMPORT_C void ToggleItemL(TInt aItemIndex);
	
    /**
     * Selects an item by index. 
     *
     * This function leaves if memory could not be allocated for an extra item
     * in the array of selected items.
     *
     * @param aItemIndex Item to select.
     * @panic EEikPanicListBoxNoSelIndexArray Panics if selection indexes have 
     *        not been defined for this class. 
     */
    IMPORT_C void SelectItemL(TInt aItemIndex);
	
    /**
     * Deselects an item by index.
     *
     * @param aItemIndex Item to deselect.
     * @panic EEikPanicListBoxNoSelIndexArray Panics if selection indexes have 
     *        not been defined for this class. 
     */
    IMPORT_C void DeselectItem(TInt aItemIndex);
	
    /**
     * Sets the anchor to the specified item.
     *
     * @param aItemIndex The index of the item at which the anchor is set.
     */
    IMPORT_C void SetAnchor(TInt aItemIndex);
	
    /**
     * Resets the anchor index, the active end and the  @c EAnchorExists flag.
     */
    IMPORT_C void ClearSelectionAnchorAndActiveIndex();

	// functions that support scrolling
    /**
     * Scrolls vertically to make a particular item visible. 
     * 
     * @param aItemIndex The item to make visible.
     * @return @c ETrue if any scrolling was done, @c EFalse if no 
     *         scrolling was necessary.
     */
	IMPORT_C virtual TBool ScrollToMakeItemVisible(TInt aItemIndex);
    
    /**
     * Sets the index of the item to be the top item.
     *
     * @param aNewTopItemIndex The item to scroll to.
     */
	IMPORT_C virtual void VScrollTo(TInt aNewTopItemIndex);

    /**
     * Sets the index of the item to be the top item.
     *
     * This two argument version returns the area which needs redrawing via 
     * @c aMinRedrawRect&. This function does not perform the redraw.
     *
     * @param aNewTopItemIndex The distance by which to scroll. 
     * @param aMinRedrawRect On return, the minimum rectangle to redraw.
     */
    IMPORT_C virtual void VScrollTo(TInt aNewTopItemIndex, 
                                    TRect& aMinRedrawRect);
	
    /**
     * Scrolls horizontally by the specified number of pixels.
     *
     * @param aHScrollAmount The distance to scroll by in pixels. A negative 
     *        value scrolls to the left, a positive value scrolls to the right.
     */
    IMPORT_C virtual void HScroll(TInt aHScrollAmount);
	
    /**
     * Gets the offset of the visible portion of the data from the left margin
     * in pixels.
     *
     * @return The horizontal scroll offset in pixels.
     */
    IMPORT_C TInt HScrollOffset() const;

    /**
     * Sets the horizontal scroll offset in pixels.
     *
     * @param aHorizontalOffset New value for the horizontal scroll offset, in 
     *        pixels.
     */
	IMPORT_C void SetHScrollOffset(TInt aHorizontalOffset);

    /**
     * Gets the width of the widest item in the list in pixels.
     *
     * @return Data width in pixels.
     */
	IMPORT_C TInt DataWidth() const;

    /**
     * Recalculates the data width of this list box view from the item width 
     * of its list item drawer. This method is called directly by 
     * @c CEikListBox when the list box’s size changes or when data is added.
     */
	IMPORT_C virtual void CalcDataWidth();

    /**
     * Gets the visible width of the specified rectangle in pixels. This 
     * function is called by @c CListBoxView itself on its own viewing 
     * rectangle.
     *
     * @param aRect The rectangle to get the visible width for.
     * @return Visible width of @c aRect.
     */
	IMPORT_C virtual TInt VisibleWidth(const TRect& aRect) const;

    /**
     * Calculates which item should be selected in order to make a 
     * particular item visible. Calling 
     * @c VScrollTo(CalcNewTopItemIndexSoItemIsVisible(idx)), for example, 
     * would make the item whose index is @c idx visible.
     *
     * @param aItemIndex The index of the new top item.
     * @return The item to be selected. 
     */
    IMPORT_C virtual TInt CalcNewTopItemIndexSoItemIsVisible(
                                                        TInt aItemIndex) const;

	// functions that support drawing
    /**
     * Draws every visible item into the specified rectangle. 
     *
     * As implemented in @c CListBoxView, this function's argument is ignored 
     * and the internal viewing rectangle is used. See @c SetViewRect().
     *
     * @param aClipRect The rectangle to draw into, this is ignored. Default 
     *        value is NULL.
     * @panic EEikPanicListBoxNoModel Panics if the list box model for this 
     *        class has not been defined. 
     */
	IMPORT_C virtual void Draw(const TRect* aClipRect = NULL) const;

    /**
     * Draws the specified item via @c CListBoxDrawer::DrawItem() if it is 
     * visible.
     *
     * @param aItemIndex Index number of the item to draw.
     */
	IMPORT_C virtual void DrawItem(TInt aItemIndex) const;

    /**
     * Sets list box backroung text. This text is visible if the list box 
     * has no items.
     *
     * @param aText The text for the empty list box background.
     */
	IMPORT_C void SetListEmptyTextL(const TDesC& aText);

    /**
     * Gets an empty list box text. 
     * 
     * @return Pointer the empty list box text. 
     */
	inline const TDesC* EmptyListText() const;

    /**
     * Tests whether an item is selected.
     *
     * @param aItemIndex Index of item to test.
     * @return @c ETrue if the item is selected.
     */    
    IMPORT_C TBool ItemIsSelected(TInt aItemIndex) const; 

    /**
     * Tests whether an item is visible.
     *
     * @param aItemIndex Index of item to be tested.
     * @return @c ETrue if the item is visible.
     */
	IMPORT_C TBool ItemIsVisible(TInt aItemIndex) const;

    /**
     * Gets the on-screen position of an item.
     * 
     * @param aItemIndex Index of an item.
     * @return Position of the item.
     */
	IMPORT_C virtual TPoint ItemPos(TInt aItemIndex) const;

    /**
     * Gets the on-screen size of an item. 
     * 
     * As implemented in @c CListBoxView, all items report the same size. 
     * The size returned may be larger than the width of the list box view, but
     * will not be smaller.
     *
     * @param aItemIndex Index of an item. Default value is 0.
     * @return Size of the item.
     */
	IMPORT_C virtual TSize ItemSize(TInt aItemIndex=0) const;

    /**
     * Sets the colour in which to display text.
     *
     * @param aColor Colour in which to display text.
     */
	IMPORT_C void SetTextColor(TRgb aColor);

    /**
     * Sets the background colour.
     *
     * @param aColor The background colour.
     */
	IMPORT_C void SetBackColor(TRgb aColor);
	
    /**
     * Gets the colour in which text is to be displayed.
     *
     * @return Current text colour.
     */
    IMPORT_C TRgb TextColor() const;

    /**
     * Gets the background colour for this view.
     * 
     * @return The background colour.
     */
	IMPORT_C TRgb BackColor() const;

    /**
     * Moves the current item cursor in the specified direction. This function 
     * is called by @c CEikListBox in response to user input.
     *
     * @param aCursorMovement The cursor movement to apply. 
     * @param aSelectionMode The selection mode of the calling list box.
     */
	IMPORT_C virtual void MoveCursorL(TCursorMovement aCursorMovement, 
                                      TSelectionMode aSelectionMode);
	
    /**
     * Moves to the specified item, sets it as the current item and scrolls the
     * display to make the item visible.
     *
     * @param aTargetItemIndex The index of the item to which to move.
     * @param aSelectionMode The selection mode. 
     */
    IMPORT_C virtual void VerticalMoveToItemL(TInt aTargetItemIndex, 
                                              TSelectionMode aSelectionMode);
	
    /**
     * Converts a pixel position into an item index.
     *
     * The function returns @c ETrue and sets @c aItemIndex to the index of the
     * item whose bounding box contains @c aPosition. Returns @c EFalse if no 
     * such item exists.
     *
     * @param aPosition A position relative to the origin of the list box 
     *                  control.
     * @param aItemIndex Is set to the item at that position. 
     * @return @c ETrue if there was an item at @c aPosition.
     */
    IMPORT_C virtual TBool XYPosToItemIndex(TPoint aPosition, 
                                            TInt& aItemIndex) const;   
    
    /**
     * Gets the number of items that will fit into a given rectangle.
     *
     * @param aRect The rectangle.
     * @return The number of items that will fit into the given rectangle.
     */
    IMPORT_C virtual TInt NumberOfItemsThatFitInRect(const TRect& aRect) const;

    /**
     * Sets the visibility observer.
     *
     * @param aObserver New visibility observer for this control.
     */
    void SetVisibilityObserver(MListVisibilityObserver* aObserver);

    /**
     * Tests if this view is visible.
     *
     * @return @c ETrue if this view is visible. @c EFalse if this view 
     *         is not visible or does not exist.
     */
	IMPORT_C TBool IsVisible() const;

    /**
     * Gets the object used by this list box view to draw its items.
     *
     * @return Pointer to the list box item drawer. 
     */
	inline CListItemDrawer* ItemDrawer() const;

    /**
     * Not implemented.
     * 
     * @param aClientRect Not used.
     */
	IMPORT_C virtual void DrawEmptyList(const TRect &aClientRect) const;

    // disables vertical line drawing, useful only for certain 
    //custom list boxes
    /**
     * Disables vertical line drawing.
     *
     * @param aDisable @c ETrue if disabled.
     */
    void DisableVerticalLineDrawing( TBool aDisable );

    /** 
    * Deselects range between given indexes.
    *
    * @deprecated
    * @param aItemIndex1 First index of selectable range.
    * @param aItemIndex2 Second index of selectable range.
    */
    IMPORT_C void DeselectRangeL(TInt aItemIndex1, TInt aItemIndex2);

    /**
     * Sets the offset for view.
     *
     * @internal
     * @param aOffset Offset in pixels.
     */
    IMPORT_C void SetItemOffsetInPixels(TInt aOffset);
    
    /**
     * Gets view offset.
     *
     * @internal
     * @return View's offset.
     */
    IMPORT_C TInt ItemOffsetInPixels() const;
    
    /**
     * Sets scrolling state.
	 *
	 * @internal
     */
    void SetScrolling( TBool aIsScrolling );
	 
	/**
	 * Returns item's height. All items have the same height.
	 *
	 * @internal
	 * @return Item height.
	 */ 
    TInt ItemHeight() const { return iItemHeight; }
    
    /**
     * Tests whether an item is partially visible.
     * Note that this returns @c EFalse also when item is fully visible,
     * i.e. the whole item area is inside the list view rectangle.
     *
     * @param  aItemIndex  Index of item to be tested.
     *
     * @return @c ETrue if the item is partially visible,
     *         @c EFalse if it's not visible or fully visible.
     */
    IMPORT_C TBool ItemIsPartiallyVisible( TInt aItemIndex ) const;

protected:

	// functions for accessing the flags
    /**
     * Gets this view’s flags.
     *
     * These flags are defined by the nested enum @c TFlags (below).
     *
     * @return List box's flags. 
     */
	inline TInt Flags() const;

    /**
     * Sets this view’s flags according to a bitmask.
     *
     * These flags are defined by the nested enum @c TFlags (below).
     *
     * @param aMask Sets new flags for the list box.
     */
	inline void SetFlags(TInt aMask);

    /**
     * Clears this view’s flags according to a bitmask.
     *
     * These flags are defined by the nested enum @c TFlags (below).
     *
     * @param aMask Flags to be removed. 
     */
	inline void ClearFlags(TInt aMask);

    /**
     * List box base class.
     * To access @c SetFlags()/ClearFlags().
     */
    friend class CEikListBox; 

	// misc. functions
    /**
     * Selects items between given indexes.
     * 
     * @deprecated
     * @param aItemIndex1 First index of selectable range.
     * @param aItemIndex2 Second index of selectable range.
     */
	IMPORT_C void SelectRangeL(TInt aItemIndex1, TInt aItemIndex2);

private:
    /**
     * Set item index directly. 
     * For CEikListBox.
     * @param aItemIndex New item index.
     */
    void SetItemIndex( TInt aItemIndex );
 
    /**
     * Tests whether an item is visible. This method get bottom item index 
     * from parameter
     *
     * @param aItemIndex Index of item to be tested.
     * @param aBottomItemIndex Index of item in the bottom of view.
     * @return @c ETrue if the item is visible.
     */
    TBool ItemIsVisible(TInt aItemIndex, TInt aBottomItemIndex) const;

    /**
     * Selects an item by index. 
     *
     * This function leaves if memory could not be allocated for an extra item
     * in the array of selected items.
     *
     * @param aItemIndex Item to select.
     * @param aBottomItemIndex Index of item in the bottom of view.
     * @panic EEikPanicListBoxNoSelIndexArray Panics if selection indexes have 
     *        not been defined for this class. 
     */
    void SelectItemL(TInt aItemIndex, TInt aBottomItemIndex);

    /**
     * Deselects an item by index.
     *
     * @param aItemIndex Item to deselect.
     * @param aBottomItemIndex Index of item in the bottom of view.
     * @panic EEikPanicListBoxNoSelIndexArray Panics if selection indexes have 
     *        not been defined for this class. 
     */
    void DeselectItem(TInt aItemIndex, TInt aBottomItemIndex);

    /**
     * Draws the specified item via @c CListBoxDrawer::DrawItem() if it is 
     * visible.
     *
     * @param aItemIndex Index number of the item to draw.
     * @param aBottomItemIndex Index of item in the bottom of view.
     */
    void DrawItem(TInt aItemIndex, TInt aBottomItemIndex) const;
    
    /**
     * Updates item selection.
     *
     * @param aSelectionMode The selection mode. 
     * @param aBottomItemIndex Index of item in the bottom of view.
     */
    void UpdateSelectionL(TSelectionMode aSelectionMode, TInt aBottomItemIndex);

protected:

    /**
     * The flags for this list box. These flags are defined by the nested enum
     * @c TFlags (below).
     */
	TInt iFlags;   	

    /**
     * This view’s item drawer.
     * Not owned.
     */
	CListItemDrawer* iItemDrawer;

    /**
     * This view’s model.
     * Not owned.
     */
	MListBoxModel* iModel;

    /**
     * Width (in pixels) of the longest item in the model.
     */
	TInt iDataWidth;			
    
    /**
     * Index of the item at the top of the view. This is not necessarily the 
     * item at the start of the list.
     */
    TInt iTopItemIndex;
	
    /**
     * Index of the item at the bottom of the view. This is not necessarily the
     * item at the end of the list.
     */
    TInt iBottomItemIndex;
	
    /**
     * Pixel offset of the visible portion of the data from the left margin.
     */
    TInt iHScrollOffset; 
	
    /**
     * Index of the current item.
     */
    TInt iCurrentItemIndex;
	
    /**
     * Height of each item in the list in pixels.
     */
    TInt iItemHeight;
	
    /**
     * This list box view’s window.
     */
    RWindow* iWin;
	
    /**
     * The window group of this view.
     */
    RWindowGroup* iGroupWin;
	
    /**
     * Graphics context for the control.
     */
    CWindowGc* iGc;
	
    /**
     * Graphics context for the control.
     */
    TRect iViewRect;

    /**
     * The empty list text.
     */
	HBufC *iListEmptyText;
    
    /**
     * Indicates whether vertical line drawing is disabled.
     */
    TBool iDisableVerticalLineDrawing /*TInt iSpare*/;

private:
	TInt iMatcherCursorPos;
	TRgb iMatcherCursorColor; 
	TRgb iBackColor;
	TRgb iTextColor;
	TInt iAnchorIndex;  
	TInt iActiveEndIndex;
	CSelectionIndexArray* iSelectionIndexes;
	MListVisibilityObserver* iVisibilityObserver;
protected:
    /**
     * Current vertical offset of the view in pixels.
     */
    TInt iVerticalOffset;

	CListBoxViewExtension* iExtension;
    TInt iSpare[4];
	};

NONSHARABLE_CLASS( CListBoxViewExtension ) : public CBase
    {
    public:
        static CListBoxViewExtension* NewL();
        
        ~CListBoxViewExtension();
        
    private:
        void ConstructL();
        
    public:
	CEikListBox* iListBox;
	TBool iScrolling;
	TBool iScrollingDisabled;
    };


/**
 * Return text currently in the empty list text
 */
inline const TDesC* CListBoxView::EmptyListText() const
	{ return(iListEmptyText); }


class CSnakingListBoxView : public CListBoxView
	{
public:
	IMPORT_C ~CSnakingListBoxView();
	IMPORT_C CSnakingListBoxView();
	inline TInt ColumnWidth() const;
	IMPORT_C void SetColumnWidth(TInt aColumnWidth);
	IMPORT_C virtual void MoveCursorL(TCursorMovement aCursorMovement, TSelectionMode aSelectionMode);
	IMPORT_C virtual void SetTopItemIndex(TInt aItemIndex);
	IMPORT_C virtual void SetItemHeight(TInt aItemHeight);
	IMPORT_C virtual TBool XYPosToItemIndex(TPoint aPosition, TInt& aItemIndex) const;
	IMPORT_C virtual TInt NumberOfItemsThatFitInRect(const TRect& aRect) const;
	IMPORT_C virtual void HScroll(TInt aHScrollAmount);
	IMPORT_C virtual void CalcDataWidth();
	IMPORT_C virtual void CalcBottomItemIndex();
	IMPORT_C virtual void Draw(const TRect* aClipRect = NULL) const;
	IMPORT_C virtual TInt VisibleWidth(const TRect& aRect) const;
	IMPORT_C virtual TBool ScrollToMakeItemVisible(TInt aItemIndex);
	IMPORT_C virtual TInt CalculateHScrollOffsetSoItemIsVisible(TInt aItemIndex);
	IMPORT_C virtual TInt CalcNewTopItemIndexSoItemIsVisible(TInt aItemIndex) const;
	IMPORT_C virtual TPoint ItemPos(TInt aItemIndex) const;
	IMPORT_C virtual TSize ItemSize(TInt aItemIndex=0) const;
	IMPORT_C void CalcRowAndColIndexesFromItemIndex(TInt aItemIndex, TInt& aRowIndex, TInt& aColIndex) const;
	IMPORT_C void CalcItemIndexFromRowAndColIndexes(TInt& aItemIndex, TInt aRowIndex, TInt aColIndex) const;
	IMPORT_C virtual TInt NumberOfItemsPerColumn() const;
protected:
	IMPORT_C virtual void DrawItemRange(TInt aStartItemIndex, TInt aEndItemIndex) const;
	IMPORT_C void DrawColumnRange(TInt aStartColIndex, TInt aEndColIndex) const;
	IMPORT_C void MoveToPreviousColumnL(TSelectionMode aSelectionMode);
	IMPORT_C void MoveToNextColumnL(TSelectionMode aSelectionMode);
	IMPORT_C void ClearUnusedItemSpace(TInt aStartItemIndex, TInt aEndItemIndex) const;
	IMPORT_C void UpdateHScrollOffsetBasedOnTopItemIndex();
private: // overridden from CListBoxView
	IMPORT_C virtual TAny* Reserved_1();
protected:
	TInt iColumnWidth;
	};



inline TInt CListBoxView::Flags() const
	{ return iFlags; }

inline void CListBoxView::SetFlags(TInt aMask)
	{ iFlags|=aMask; }
 
inline void CListBoxView::ClearFlags(TInt aMask)
	{ iFlags&=(~aMask); }

inline CListItemDrawer* CListBoxView::ItemDrawer() const
	{ return iItemDrawer; }

inline TInt CSnakingListBoxView::ColumnWidth() const
	{ return iColumnWidth; }


#endif  // __EIKLBV_H__
