#ifndef NULLOSFT_MEDIALIBRARY_SKINNED_SCROLLWINDOW_HEADER
#define NULLOSFT_MEDIALIBRARY_SKINNED_SCROLLWINDOW_HEADER

#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#pragma once
#endif

#include "./skinnedwnd.h"

typedef struct _SCROLLBAR SCROLLBAR;

// scroll modes
#define SCROLLMODE_STANDARD_I 0x00
#define SCROLLMODE_LISTVIEW_I 0x01
#define SCROLLMODE_TREEVIEW_I 0x02
#define SCROLLMODE_COMBOLBOX_I 0x03

class SkinnedScrollWnd : public SkinnedWnd
{
public:
	typedef enum InvalidateFlags
	{
		InvalidateFlag_Normal = 0,
		InvalidateFlag_RedrawNow = (1 << 0),
		InvalidateFlag_Frame = (1 << 1),
		InvalidateFlag_VertBarAppeared = (1 << 2),
		InvalidateFlag_VertBarRemoved = (1 << 3),
		InvalidateFlag_HorzBarAppeared = (1 << 4),
		InvalidateFlag_HorzBarRemoved = (1 << 5),
	} InvalidateFlags;
	
protected:
	SkinnedScrollWnd(BOOL bIsDialog);
	virtual ~SkinnedScrollWnd(void);

public:
	void UpdateScrollBars(BOOL fInvalidate);
	void ShowHorzScroll(BOOL fEnable);
	void ShowVertScroll(BOOL fEnable);
	BOOL IsHorzBarHidden();
	BOOL IsVertBarHidden();
	BOOL SetMode(UINT nMode);
	UINT GetMode();
	void DisableNoScroll(BOOL bDisable);
	BOOL IsNoScrollDisabled();
	
protected:
	virtual BOOL Attach(HWND hwndHeader);
	virtual LRESULT WindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam);

	virtual INT OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS *pncsp);
	virtual INT OnNcHitTest(POINTS pts);
	virtual void OnNcPaint(HRGN rgnUpdate);
	virtual void OnNcMouseMove(UINT nHitTest, POINTS pts);
	virtual void OnNcLButtonDown(UINT nHitTest, POINTS pts);
	virtual void OnNcMouseLeave();
	virtual void OnStyleChanged(INT styleType, STYLESTRUCT *pss);
	virtual void OnLButtonUp(UINT nFlags, POINTS pts);
	virtual void OnMouseMove(UINT nFlags, POINTS pts);
	virtual void OnTimer(UINT_PTR idEvent, TIMERPROC fnTimer);
	virtual LRESULT OnEraseBackground(HDC hdc);
	virtual void OnPrint(HDC hdc, UINT options); 
	virtual void OnSkinChanged(BOOL bNotifyChildren, BOOL bRedraw);


	virtual BOOL OnMediaLibraryIPC(INT msg, INT_PTR param, LRESULT *pResult);	

	BOOL ShowScrollBar(int wBar, BOOL fShow);
	void UpdateScrollBar(SCROLLBAR *psb, InvalidateFlags *invalidateFlags);
	void InvalidateNC(InvalidateFlags invalidate, UINT bars);
	void PaintNonClient(HDC hdc);
	INT AdjustHover(UINT nHitTest, POINTS pts);
	void UpdateFrame();

	
	LRESULT OnListViewScroll(INT dx, INT dy);
	void OnVertScroll(UINT code, UINT pos, HWND hwndSB);
	void OnMouseWheel(INT delta, UINT vtKey, POINTS pts);

	void Emulate_LeftButtonUp(UINT nFlags, POINTS pts, BOOL forwardMessage);

private:
	friend BOOL SkinWindowEx(HWND hwndToSkin, INT type, UINT style);
	friend static BOOL GetHScrollRect(SkinnedScrollWnd *pWnd, RECT *prc);
	friend static BOOL GetVScrollRect(SkinnedScrollWnd *pWnd, RECT *prc);


private:
    
	SCROLLBAR	*psbHorz;		
	SCROLLBAR	*psbVert;		
	UINT		scrollFlags;
	UINT scrollPortionHover;
	int wheelCarryover;
};
 
DEFINE_ENUM_FLAG_OPERATORS(SkinnedScrollWnd::InvalidateFlags);

#endif //NULLOSFT_MEDIALIBRARY_SKINNED_SCROLLWINDOW_HEADER