
/*
 * Copyright 2011 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */
#include "SkProgressBarView.h"
#include "SkAnimator.h"
#include "SkWidgetViews.h"
#include "SkTime.h"
#include "SkSystemEventTypes.h"

SkProgressBarView::SkProgressBarView()
{
	init_skin_anim(kProgress_SkinEnum, &fAnim);
	fAnim.setHostEventSink(this);
	fProgress = 0;
	fMax = 100;
	
}

void SkProgressBarView::changeProgress(int diff)
{
	int newProg = fProgress + diff;
	if (newProg > 0 && newProg < fMax)
		this->setProgress(newProg);
	//otherwise i'll just leave it as it is
	//this implies that if a new max and progress are set, max must be set first
}

/*virtual*/ void SkProgressBarView::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 SkProgressBarView::onEvent(const SkEvent& evt)
{
	if (evt.isType(SK_EventType_Inval))
	{
		this->inval(NULL);
		return true;
	}
	if (evt.isType("recommendDim"))
	{
		SkScalar	height;
		
		if (evt.findScalar("y", &height))
			this->setHeight(height);
		return true;
	}
	return this->INHERITED::onEvent(evt);
}

/*virtual*/ void SkProgressBarView::onInflate(const SkDOM& dom, const SkDOM::Node* node)
{
	this->INHERITED::onInflate(dom, node);
	int32_t temp;
	if (dom.findS32(node, "max", &temp))
		this->setMax(temp);
	if (dom.findS32(node, "progress", &temp))
		this->setProgress(temp);
}

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

void SkProgressBarView::reset()
{
	fProgress = 0;
	SkEvent e("user");
	e.setString("id", "reset");
	fAnim.doUserEvent(e);
}

void SkProgressBarView::setMax(int max)
{
	fMax = max;
	SkEvent e("user");
	e.setString("id", "setMax");
	e.setS32("newMax", max);
	fAnim.doUserEvent(e);
}

void SkProgressBarView::setProgress(int progress)
{
	fProgress = progress;
	SkEvent e("user");
	e.setString("id", "setProgress");
	e.setS32("newProgress", progress);
	fAnim.doUserEvent(e);
}
