Blob Blame Raw
#pragma once

#ifndef TNZ_SCROLLBAR_INCLUDED
#define TNZ_SCROLLBAR_INCLUDED

//#include "tw/action.h"
//#include "traster.h"
#include "tw/tw.h"

#undef DVAPI
#undef DVVAR
#ifdef TWIN_EXPORTS
#define DVAPI DV_EXPORT_API
#define DVVAR DV_EXPORT_VAR
#else
#define DVAPI DV_IMPORT_API
#define DVVAR DV_IMPORT_VAR
#endif

class TScrollbarGenericAction
{
public:
	TScrollbarGenericAction() {}
	virtual ~TScrollbarGenericAction() {}
	virtual void notify(int value) = 0;
};

template <class T>
class TScrollbarAction : public TScrollbarGenericAction
{
public:
	typedef void (T::*CommandMethod)(int value);

	T *m_target;
	CommandMethod m_method;

	TScrollbarAction<T>(T *target, CommandMethod method) : m_target(target), m_method(method){};
	void notify(int value) { (m_target->*m_method)(value); };
};

class DVAPI TScrollbar : public TWidget
{

	int m_oldPos;
	int m_gPos, m_gMinPos, m_gMaxPos, m_gSize;
	int m_value, m_minValue, m_maxValue, m_cursorSize;
	const int m_buttonAreaSize;
	TScrollbarGenericAction *m_action;
	bool m_firstButtonPressed, m_secondButtonPressed;
	bool m_horizontal;
	bool m_minOverflowEnabled;
	bool m_maxOverflowEnabled;
	int m_buttonIncrement;

protected:
	void updatePositions();

	void drawHCursor(int x0, int x1);
	void drawVCursor(int y0, int y1);
	enum ButtonId { FIRST_BUTTON,
					SECOND_BUTTON };
	void drawButton(ButtonId id);

public:
	TScrollbar(TWidget *parent, string name = "scrollbar");
	~TScrollbar();

	void repaint();

	void leftButtonDown(const TMouseEvent &);
	void leftButtonDrag(const TMouseEvent &);
	void leftButtonUp(const TMouseEvent &);

	void configureNotify(const TDimension &d);

	void setValue(int value, int min, int max, int size);
	int getValue() const { return m_value; }

	// min <= value <= max
	// il cursore occupa almeno size/(max-min+size) dell'area disponibile
	// se size = 0 non c'e' cursore e lo slider e' disabilitato
	// se size>=max-min il cursore occupa tutto lo spazio e lo slider e' disabilitato
	//
	// value == min quando il cursore e' in alto
	// value == max quando il cursore e' in basso
	//
	// quando vengono premuti i bottoni value viene incrementato/decrementato di uno
	//

	// abilita/disabilita la possibilita' di agire sui bottoni anche
	// quando lo slider e' gia' sul massimo/minimo
	// default: false/false
	void enableButtonOverflow(bool min, bool max);

	// default: 4
	void setButtonIncrement(int d);

	void setAction(TScrollbarGenericAction *action);
	void onTimer(int v);
};

#endif