//------------------------------------------------------------------------
// CRockerSwitch
//------------------------------------------------------------------------
// Switch, which releases itself after being clicked
CRockerSwitch::CRockerSwitch (const CRect &size,
                              CControlListener *listener, 
                              long tag,              // identifier tag (ID)
                              long heightOfOneImage, // height of one image in pixel
                              CBitmap *background,
                              CPoint  &offset, const long style)
:	CControl (size, listener, tag, background), offset (offset), 
	heightOfOneImage (heightOfOneImage), style (style)
{}

//------------------------------------------------------------------------
CRockerSwitch::~CRockerSwitch ()
{}

//------------------------------------------------------------------------
void CRockerSwitch::draw (CDrawContext *pContext)
{
	CPoint where (offset.h, offset.v);

	if (value == 1.f)
		where.v += 2 * heightOfOneImage;
	else if (value == 0.f)
		where.v += heightOfOneImage;

	if (pBackground)
	{
		if (bTransparencyEnabled)
			pBackground->drawTransparent (pContext, size, where);
		else
			pBackground->draw (pContext, size, where);
	}
	setDirty (false);
}

//------------------------------------------------------------------------
void CRockerSwitch::mouse (CDrawContext *pContext, CPoint &where)
{
	if (!bMouseEnabled)
		return;

	long button = pContext->getMouseButtons ();
	if (!(button & kLButton))
		return;

	float fEntryState = value;

	long  width_2 = size.width () / 2;
	long  height_2 = size.height () / 2;
	if (button)
	{
		// begin of edit parameter
		getParent ()->beginEdit (tag);
		do
		{
			if (style & kHorizontal) 
			{
				if (where.h >= size.left && where.v >= size.top  &&
					where.h <= (size.left + width_2) && where.v <= size.bottom)
					value = -1.0f;
				else if (where.h >= (size.left + width_2) && where.v >= size.top  &&
					where.h <= size.right && where.v <= size.bottom)
					value = 1.0f;
				else
					value = fEntryState;
			}
			else
			{
				if (where.h >= size.left && where.v >= size.top  &&
					where.h <= size.right && where.v <= (size.top + height_2))
					value = -1.0f;
				else if (where.h >= size.left && where.v >= (size.top + height_2) &&
					where.h <= size.right && where.v <= size.bottom)
					value = 1.0f;
				else
					value = fEntryState;
			}

			if (isDirty () && listener)
				listener->valueChanged (pContext, this);

			pContext->getMouseLocation (where);

			doIdleStuff ();
		}
		while (pContext->getMouseButtons ());

		// end of edit parameter
		getParent ()->endEdit (tag);
	}
	else
	{
		if (where.h >= size.left && where.v >= size.top  &&
				where.h <= (size.left + width_2) && where.v <= size.bottom)
			value = -1.0f;
		else if (where.h >= (size.left + width_2) && where.v >= size.top  &&
				where.h <= size.right && where.v <= size.bottom)
			value = 1.0f;

		if (listener)
			listener->valueChanged (pContext, this);
	}

	value = 0.f;  // set button to UNSELECTED state
	if (listener)
		listener->valueChanged (pContext, this);
}

//------------------------------------------------------------------------
bool CRockerSwitch::onWheel (CDrawContext *pContext, const CPoint &where, float distance)
{
	if (!bMouseEnabled)
		return false;

	if (distance > 0)
		value = -1.0f;
	else
		value = 1.0f;

	if (isDirty () && listener)
		listener->valueChanged (pContext, this);

	value = 0.0f;  // set button to UNSELECTED state
	if (listener)
		listener->valueChanged (pContext, this);
	return true;

}