// EIKSBFRM.H
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//
	
#if !defined(__EIKSBFRM_H__)
#define __EIKSBFRM_H__

#if !defined(__EIKSCRLB_H__)
#include <eikscrlb.h>
#endif

// 
// TEikScrollBarFrameLayout
//

class TEikScrollBarFrameLayout
	{
public:
	// enums
	enum TTilingMode
		{
		EClientRectConstant,
		EInclusiveRectConstant
		};
public:
	// c'tor
	IMPORT_C TEikScrollBarFrameLayout();

	// set all margins to the same value
	IMPORT_C void SetInclusiveMargin(TInt aMargin);
	IMPORT_C void SetClientMargin(TInt aMargin);
public:
	TMargins iInclusiveMargin;
	TMargins iClientMargin;
	TSize iClientAreaGranularity;
	TTilingMode iTilingMode;
	};

// 
// CEikScrollBarFrame
//

class CEikCornerWindow;

class CEikScrollBarFrame : public CBase
	{
public:	// enums
	enum TScrollBarVisibility
		{
		EOff,
		EOn,
		EAuto
		};
public:	// specific
	IMPORT_C CEikScrollBarFrame(CCoeControl* aParentWindow, MEikScrollBarObserver* aObserver, TBool aPreAlloc=EFalse);
	IMPORT_C ~CEikScrollBarFrame();

	// drawing
	IMPORT_C void DrawScrollBarsNow() const;

	// scrollbar visibility functions
	IMPORT_C void SetScrollBarVisibilityL(TScrollBarVisibility aHVisibility, TScrollBarVisibility aVVisibility);
	inline TScrollBarVisibility HScrollBarVisibility() const;
	inline TScrollBarVisibility VScrollBarVisibility() const;

	// scrollbar dimming
	IMPORT_C void SetScrollBarsDimmed(TBool aHorizDimmed, TBool aVertDimmed) const;

	// Tile  - the main function
	IMPORT_C TBool TileL(TEikScrollBarModel* aHModel, TEikScrollBarModel* aVModel,
			  TRect& aClientRect, TRect& aInclusiveRect, const TEikScrollBarFrameLayout& aLayout);

	// move scrollbar thumbs functions
	IMPORT_C void MoveThumbsBy(TInt aDeltaX, TInt aDeltaY) const;
	IMPORT_C void MoveHorizThumbTo(TInt aHorizThumbPos) const;
	IMPORT_C void MoveVertThumbTo(TInt aVertThumbPos) const;

 	IMPORT_C TInt ScrollBarBreadth(CEikScrollBar::TOrientation aOrientation) const;

	// scroll bar frame behavior functions
	IMPORT_C void SetAdjustsHorizontalModel(TBool aAdjusts); 
	IMPORT_C void SetAdjustsVerticalModel(TBool aAdjusts);
	IMPORT_C TBool AdjustsHorizontalModel() const;
	IMPORT_C TBool AdjustsVerticalModel() const;

	// scrollbar flags functions
	inline void SetFlagsForHScrollBar(TInt aMask);
	inline void SetFlagsForVScrollBar(TInt aMask);
	inline void ClearFlagsForHScrollBar(TInt aMask);
	inline void ClearFlagsForVScrollBar(TInt aMask);
	inline TInt FlagsForHScrollBar() const;
	inline TInt FlagsForVScrollBar() const;

	// does a scrollbar exist? function
	IMPORT_C TBool ScrollBarExists(CEikScrollBar::TOrientation aOrientation) const;

	// component control functions
	IMPORT_C TInt CountComponentControls() const;
	IMPORT_C CCoeControl* ComponentControl(TInt aIndex) const;
	IMPORT_C CEikScrollBar* GetScrollBarHandle(CEikScrollBar::TOrientation aOrientation) const;
private:
	// enums
	enum TMarginsAdjustmentMode
		{
		EGrow,
		EShrink
		};
private:
	void CalcTheoreticalScrollBarVisibility(const TEikScrollBarModel* aHModel, const TEikScrollBarModel* aVModel);
	void CheckPhysicalScrollBarVisibility(TEikScrollBarModel* aHModel, TEikScrollBarModel* aVModel, const TRect& aOutputRect, const TEikScrollBarFrameLayout& aLayout);
	void AdjustRect(TRect& aOutputRect, TEikScrollBarFrameLayout::TTilingMode aTilingMode) const;
	void CreateOrRemoveRequiredScrollBarsL();
	void RemoveScrollBar(CEikScrollBar*& aScrollBar);
	void TileScrollBarsWithClientL(const TRect& aClientRect, const TEikScrollBarModel* aHModel, const TEikScrollBarModel* aVModel);
	TBool AdjustScrollBarModel(CEikScrollBar::TOrientation aOrientation, TEikScrollBarModel* aModel, TInt aNewPixelThumbSpan, const TEikScrollBarFrameLayout& aLayout) const;
	void AdjustRectByMargins(TMarginsAdjustmentMode aMode, TRect& aRect, const TMargins& aMargins) const;
	CEikScrollBar* CreateSBarLC(CEikScrollBar::TOrientation aOrientation,TInt aFlags) const;
	CEikScrollBar* CreateHSBarLC() const;
	CEikScrollBar* CreateVSBarLC() const;
	CEikCornerWindow* CreateCornerWindowLC() const;
	static void CheckVisible(CCoeControl* aComponent);
private:
	TScrollBarVisibility iHVisibility;
	TScrollBarVisibility iVVisibility;
	MEikScrollBarObserver* iObserver;
	CCoeControl* iParentWindow;
	CEikCornerWindow* iCornerWindow;
	CEikScrollBar* iHSbar;
	CEikScrollBar* iVSbar;
	TInt iScrollBarFrameFlags;
	TInt iHScrollBarFlags;
	TInt iVScrollBarFlags;
	TInt iHScrollBarBreadth;
	TInt iVScrollBarBreadth;
	};
inline CEikScrollBarFrame::TScrollBarVisibility CEikScrollBarFrame::HScrollBarVisibility() const
	{ return iHVisibility; }
inline CEikScrollBarFrame::TScrollBarVisibility CEikScrollBarFrame::VScrollBarVisibility() const
	{ return iVVisibility; }
inline void CEikScrollBarFrame::SetFlagsForHScrollBar(TInt aMask)
	{ iHScrollBarFlags|=aMask; }
inline void CEikScrollBarFrame::SetFlagsForVScrollBar(TInt aMask)
	{ iVScrollBarFlags|=aMask; }
inline void CEikScrollBarFrame::ClearFlagsForHScrollBar(TInt aMask)
	{ iHScrollBarFlags&=(~aMask); }
inline void CEikScrollBarFrame::ClearFlagsForVScrollBar(TInt aMask)
	{ iVScrollBarFlags&=(~aMask); }
inline TInt CEikScrollBarFrame::FlagsForHScrollBar() const
	{ return iHScrollBarFlags; }
inline TInt CEikScrollBarFrame::FlagsForVScrollBar() const
	{ return iVScrollBarFlags; }

#endif
