/*
	GWEN
	Copyright (c) 2010 Facepunch Studios
	See license in Gwen.h
*/

#pragma once
#ifndef GWEN_CONTROLS_SCROLLBAR_H
#define GWEN_CONTROLS_SCROLLBAR_H

#include "Gwen/Controls/Base.h"
#include "Gwen/Controls/ScrollBarBar.h"
#include "Gwen/Controls/ScrollBarButton.h"
#include "Gwen/Gwen.h"

#define SCROLL_BUTTON_UP 0
#define SCROLL_BUTTON_LEFT 0
#define SCROLL_BUTTON_DOWN 1
#define SCROLL_BUTTON_RIGHT 1
#define NUDGE_DIST 10

namespace Gwen
{
namespace Controls
{
class GWEN_EXPORT BaseScrollBar : public Base
{
public:
	GWEN_CONTROL(BaseScrollBar, Base);

	virtual void Render(Skin::Base* skin);

	virtual void SetBarSize(int size) = 0;
	virtual int GetBarSize() = 0;
	virtual int GetBarPos() = 0;

	virtual void OnBarMoved(Controls::Base* control);
	virtual void OnMouseClickLeft(int /*x*/, int /*y*/, bool /*bDown*/) {}

	virtual void ScrollToLeft() {}
	virtual void ScrollToRight() {}
	virtual void ScrollToTop() {}
	virtual void ScrollToBottom() {}

	virtual float GetNudgeAmount() { return m_fNudgeAmount / m_fContentSize; }
	virtual void SetNudgeAmount(float nudge) { m_fNudgeAmount = nudge; }

	virtual void BarMovedNotification();

	virtual float CalculateScrolledAmount() { return 0; }
	virtual int CalculateBarSize() { return 0; }
	virtual bool SetScrolledAmount(float amount, bool forceUpdate);

	virtual void SetContentSize(float size);
	virtual void SetViewableContentSize(float size);

	virtual int GetButtonSize() { return 0; }
	virtual float GetScrolledAmount() { return m_fScrolledAmount; }

	Gwen::Event::Caller onBarMoved;

	float getContentSize()
	{
		return m_fContentSize;
	}
	float getViewableContentSize() const
	{
		return m_fViewableContentSize;
	}

protected:
	ControlsInternal::ScrollBarButton* m_ScrollButton[2];
	ControlsInternal::ScrollBarBar* m_Bar;

	bool m_bDepressed;
	float m_fScrolledAmount;
	float m_fContentSize;
	float m_fViewableContentSize;
	float m_fNudgeAmount;
};
}  // namespace Controls
}  // namespace Gwen
#endif
