// This file is part of VSTGUI. It is subject to the license terms 
// in the LICENSE file found in the top-level directory of this
// distribution and at http://github.com/steinbergmedia/vstgui/LICENSE

#pragma once

#include "vstguifwd.h"
#include "cviewcontainer.h"
#include "cfont.h"
#include "ccolor.h"
#include "controls/icontrollistener.h"

namespace VSTGUI {

class CTabChildView;

//-----------------------------------------------------------------------------
class CTabView : public CViewContainer, public IControlListener
//! @brief a tab view
/// @ingroup containerviews
//-----------------------------------------------------------------------------
{
public:
	enum TabPosition {
		kPositionLeft = 0,
		kPositionRight,
		kPositionTop,
		kPositionBottom
	};

	enum TabAlignment {
		kAlignCenter = 0,
		kAlignLeft,
		kAlignRight,
		kAlignTop = kAlignLeft,
		kAlignBottom = kAlignRight
	};

	CTabView (const CRect& size, CBitmap* tabBitmap, CBitmap* background = nullptr, TabPosition tabPosition = kPositionTop, int32_t style = 0);
	CTabView (const CRect& size, const CRect& tabSize, CBitmap* background = nullptr, TabPosition tabPosition = kPositionTop, int32_t style = 0);

	//-----------------------------------------------------------------------------
	/// @name Tab View Functions
	//-----------------------------------------------------------------------------
	//@{
	/** add a tab */
	virtual bool addTab (CView* view, UTF8StringPtr name = nullptr, CBitmap* tabBitmap = nullptr);
	/** add a tab */
	virtual bool addTab (CView* view, CControl* button);
	/** remove a tab */
	virtual bool removeTab (CView* view);
	/** remove all tabs */
	virtual bool removeAllTabs ();
	/** select tab at index */
	virtual bool selectTab (int32_t index);
	/** get current index of selected tab */
	virtual int32_t getCurrentSelectedTab () const { return currentTab; }

	/** the size of one tab */
	virtual CRect& getTabViewSize (CRect& rect) const;

	/** call this after the tabs are added. Tabs added after this call will have the default font style. */
	virtual void setTabFontStyle (const CFontRef font, CCoord fontSize = 12, CColor selectedColor = kBlackCColor, CColor deselectedColor = kWhiteCColor);

	/** call this after you have added all tabs to align them according to alignment */
	virtual void alignTabs (TabAlignment alignment = kAlignCenter);

	virtual void setTabViewInsets (const CPoint& inset);
	//@}

	void drawBackgroundRect (CDrawContext *pContext, const CRect& _updateRect) override;
	void valueChanged (CControl *pControl) override;
	void setViewSize (const CRect &rect, bool invalid = true) override;
	void setAutosizeFlags (int32_t flags) override;
//-----------------------------------------------------------------------------
	CLASS_METHODS (CTabView, CViewContainer)
protected:
	~CTabView () noexcept override;
	void setCurrentChild (CTabChildView* childView);

	int32_t numberOfChilds;
	int32_t currentTab;
	TabPosition tabPosition;
	int32_t style;
	CRect tabSize;
	CPoint tabViewInset;
	CBitmap* tabBitmap;
	CTabChildView* firstChild;
	CTabChildView* lastChild;
	CTabChildView* currentChild;
};

} // VSTGUI
