/*
* Copyright (c) 2008-2008 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:  header file of button and dragbar
*
*/

#ifndef C_FEPLAYOUTSCROLLABLELIST_H
#define C_FEPLAYOUTSCROLLABLELIST_H

#include <peninputlayoutchoicelist.h>
#include <AknLayout2Def.h>
#include <AknsConstants.h>
#include <e32cmn.h>

#define FORMATPAGEINFO(des, ktxt, parm...) {des.Format(ktxt, parm);};

class CAknFepCtrlCommonButton;

class CFepLayoutScrollableList : public CFepLayoutChoiceList, public MEventObserver
    {
public:
    IMPORT_C static CFepLayoutScrollableList* NewL(CFepUiLayout* aUiLayout,
                                                   TInt aControlId,
                                                   TSize aItemSize,
                                                   TInt aHorizontalMargin,
                                                   TInt aVerticalMargin,
                                                   TSize aNaviSize,
                                                   TSize aNaviInnerSize);

    IMPORT_C static CFepLayoutScrollableList* NewLC(CFepUiLayout* aUiLayout,
                                                    TInt aControlId,
                                                    TSize aItemSize,
                                                    TInt aHorizontalMargin,
                                                    TInt aVerticalMargin,
                                                    TSize aNaviSize,
                                                    TSize aNaviInnerSize);

    IMPORT_C virtual ~CFepLayoutScrollableList();

    IMPORT_C void ConstructFromResourceL();

    IMPORT_C void SizeChanged(TSize aItemSize,
                              TInt aHorizontalMargin,
                              TInt aVerticalMargin,
                              TSize aNaviSize,
                              TSize aNaviInnerSize);

    IMPORT_C void SetTextProperty(const CFont* aFont,
                                  TRgb aFontColor);

    IMPORT_C void SetImgFrId(TAknsItemID aBgFrId, 
                           TAknsItemID aNaviFrId,
                           TAknsItemID aNaviActiveFrId,
                           TAknsItemID aNaviDimFrId,
                           TAknsItemID aItemFrId,
                           TAknsItemID aItemActiveFrId);

    inline void SetTextLineLayout(TAknTextLineLayout aTextLine);

    inline void SetPageInfoTextLineLayout(TAknTextLineLayout aTextLine);
    inline void SetPageInfoFormatL(const TDesC& aFormat);

    // if current page include special item, the count also include
    // special item
    inline void SetOnePageItemCount(TInt aItemCount);

    inline void SetSpecialItemOn(TBool aOn);

    // get whole control width except item width
    inline TInt CtrlWidthExceptItem();

    // get whole control height
    inline TInt CtrlHeight();

    IMPORT_C void Draw();
    
    IMPORT_C void ReCalcLayout();
    
    IMPORT_C void UpdateNaviButtonStates();
	
	IMPORT_C void SetListSeperationRect( const TRect& aRect );
	
	inline void SetPageInfoResID( TInt aResID );

    /**
     * Hide or shoe control. A hiden control will not handle the event.
     *
     * @since S60 V4.0
     * @param aFlag ETrue if want to hide the control.
     */                                               
    IMPORT_C virtual void Hide(TBool aFlag);
    
protected:

    IMPORT_C CFepLayoutScrollableList(CFepUiLayout* aUiLayout,
                             TInt aControlId,
                             TSize aItemSize,
                             TInt aHorizontalMargin,                             
                             TInt aVerticalMargin,
                             TSize aNaviSize,
                             TSize aNaviInnerSize);

    IMPORT_C void ConstructL(); 
    
    IMPORT_C TInt HitTest(const TPoint& aPoint);

    IMPORT_C virtual void DrawItem(TInt aItemIndex, TBool aItemActive = EFalse);

    IMPORT_C virtual void CalculateItemWidth();
    
    IMPORT_C virtual void DrawPageInfo();

    void ScrollPageUp();
    
    void ScrollPageDown();

    IMPORT_C void Move(const TPoint& aOffset);
                            
private:
    void CalcPageInfo();
protected:
    //from MEventObserver
    IMPORT_C void HandleControlEvent(TInt aEventType, CFepUiBaseCtrl* aCtrl,
                            const TDesC& aEventData);
                            
    IMPORT_C void UpdatePageInfoL( TInt aCurrentPage, TInt aTotalPage );                        
	
#ifdef RD_TACTILE_FEEDBACK	
	// Update tactile feedback area when scroll page up and down.
	void UpdateFeedbackArea();
#endif // RD_TACTILE_FEEDBACK
	
protected:
    TPoint iTopLeftPoint;
    TSize iItemSize;
    TSize iNaviSize;
    TSize iNaviInnerSize;
    TInt iHorizontalMargin;
    TInt iVerticalMargin;
    TInt iBaselineOffset;
    const CFont* iFont;
    TRgb iFontColor;
    TAknTextLineLayout iTextLine;
    TBool iTextLineSet;    
    TAknTextLineLayout iPageInfoTextLine;
    TBool iPageInfoLineSet;

    RPointerArray<CFbsBitmap> iBmpList;

    TAknsItemID iBgFrId;
    // used for special item
    TAknsItemID iItemFrId;
    TAknsItemID iItemActiveFrId;

    TBool iSpecialItemOn;
    TBool iNaviBtnShown;

    HBufC* iPageInfoFormat;
    HBufC* iPageInfo;
    TInt iCurrentPage;
    TInt iTotalPages;

    //TPoint iTlPos;
    TInt iOnePageItemCnt;
    TRect iContentRect;
    TRect iScrollRect;
    TRect iPageUpRect;
    TRect iPageDownRect;
    TRect iPageInfoRect;
    RArray<TRect> iItemRects;
    CAknFepCtrlCommonButton* iPageUp;
    CAknFepCtrlCommonButton* iPageDown;
    
    // List speration 
    TRect iSeperationRect;
    CFbsBitmap* iSeperationBmp;	//own
    CFbsBitmap* iSeperationMaskBmp; // own
    
    // Res ID of page info
    TInt iPageInfoResID;
    
    TRect iLastPageItemRect;
    TInt iInitItemWidth;
    };

inline void CFepLayoutScrollableList::SetTextLineLayout(TAknTextLineLayout aTextLine)
    {
    iTextLine = aTextLine;
    iTextLineSet = ETrue;
    }
inline void CFepLayoutScrollableList::SetPageInfoTextLineLayout(TAknTextLineLayout aTextLine)
    {
    iPageInfoTextLine = aTextLine;
    iPageInfoLineSet = ETrue;
    }

inline void CFepLayoutScrollableList::SetPageInfoFormatL(const TDesC& aFormat)
    {
    delete iPageInfoFormat;
    iPageInfoFormat = NULL;
    iPageInfoFormat = aFormat.AllocL();

    // on the assumption that page info do not beyond 100
    delete iPageInfo;
    iPageInfo = NULL;
    iPageInfo = HBufC::NewL(aFormat.Length() + 6);
    }

inline void CFepLayoutScrollableList::SetOnePageItemCount(TInt aItemCount)
    {
    iOnePageItemCnt = aItemCount;
    }

inline void CFepLayoutScrollableList::SetSpecialItemOn(TBool aOn)
    {
    iSpecialItemOn = aOn;
    }

inline TInt CFepLayoutScrollableList::CtrlWidthExceptItem()
    {
    return 4*iHorizontalMargin + iNaviSize.iWidth;
    }

inline TInt CFepLayoutScrollableList::CtrlHeight()
    {
    return (iOnePageItemCnt + 1)*iVerticalMargin + iOnePageItemCnt*iItemSize.iHeight;
    }

inline void CFepLayoutScrollableList::SetPageInfoResID( TInt aResID )	
	{
	iPageInfoResID = aResID;	
	}
#endif //C_FEPLAYOUTSCROLLABLELIST_H
