#include "SkBorderView.h"
#include "SkAnimator.h"
#include "SkWidgetViews.h"
#include "SkSystemEventTypes.h"
#include "SkTime.h"
#include "SkStackViewLayout.h"

SkBorderView::SkBorderView() : fTop(SkIntToScalar(0)), fLeft(SkIntToScalar(0)),
					fRight(SkIntToScalar(0)), fBottom(SkIntToScalar(0))
{
	fAnim.setHostEventSink(this);
	init_skin_anim(kBorder_SkinEnum, &fAnim);
}

SkBorderView::~SkBorderView()
{
	
}

void SkBorderView::setSkin(const char skin[])
{
	init_skin_anim(skin, &fAnim);
}

/* virtual */ void SkBorderView::onInflate(const SkDOM& dom, const SkDOM::Node* node)
{
	this->INHERITED::onInflate(dom, node);
}

/*virtual*/ void SkBorderView::onSizeChange()
{
	this->INHERITED::onSizeChange();
	SkEvent evt("user");
	evt.setString("id", "setDim");
	evt.setScalar("dimX", this->width());
	evt.setScalar("dimY", this->height());
	fAnim.doUserEvent(evt);
}

/*virtual*/ void SkBorderView::onDraw(SkCanvas* canvas)
{
	SkPaint						paint;		
	SkAnimator::DifferenceType	diff = fAnim.draw(canvas, &paint, SkTime::GetMSecs());
	
	if (diff == SkAnimator::kDifferent)
		this->inval(NULL);
	else if (diff == SkAnimator::kPartiallyDifferent)
	{
		SkRect	bounds;
		fAnim.getInvalBounds(&bounds);
		this->inval(&bounds);
	}
}

/*virtual*/ bool SkBorderView::onEvent(const SkEvent& evt)
{
	if (evt.isType(SK_EventType_Inval))
	{
		this->inval(NULL);
		return true;
	}
	if (evt.isType("recommendDim"))
	{
		evt.findScalar("leftMargin", &fLeft);
		evt.findScalar("rightMargin", &fRight);
		evt.findScalar("topMargin", &fTop);
		evt.findScalar("bottomMargin", &fBottom);
	
		//setup_views.cpp uses SkView::Layout instead of SkStackViewLayout
		//but that gives me an error
		SkStackViewLayout* layout;
		fMargin.set(fLeft, fTop, fRight, fBottom);
		if (this->getLayout())
		{
			layout = (SkStackViewLayout*)this->getLayout();
			layout->setMargin(fMargin);
		}
		else
		{
			layout = new SkStackViewLayout;
			layout->setMargin(fMargin);
			this->setLayout(layout)->unref();
		}
		this->invokeLayout();
	}
	return this->INHERITED::onEvent(evt);
}
