/*
* 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 "SkScrollBarView.h"
#include "SkAnimator.h"
#include "SkWidgetViews.h"
#include "SkSystemEventTypes.h"
#include "SkTime.h"
//see SkProgressBarView.cpp
//#include "SkWidgetViews.cpp"
SkScrollBarView::SkScrollBarView()
{
fAnim.setHostEventSink(this);
init_skin_anim(kScroll_SkinEnum, &fAnim);
fTotalLength = 0;
fStartPoint = 0;
fShownLength = 0;
this->adjust();
}
void SkScrollBarView::setStart(unsigned start)
{
if ((int)start < 0)
start = 0;
if (fStartPoint != start)
{
fStartPoint = start;
this->adjust();
}
}
void SkScrollBarView::setShown(unsigned shown)
{
if ((int)shown < 0)
shown = 0;
if (fShownLength != shown)
{
fShownLength = shown;
this->adjust();
}
}
void SkScrollBarView::setTotal(unsigned total)
{
if ((int)total < 0)
total = 0;
if (fTotalLength != total)
{
fTotalLength = total;
this->adjust();
}
}
/* virtual */ void SkScrollBarView::onInflate(const SkDOM& dom, const SkDOM::Node* node)
{
this->INHERITED::onInflate(dom, node);
int32_t value;
if (dom.findS32(node, "total", &value))
this->setTotal(value);
if (dom.findS32(node, "shown", &value))
this->setShown(value);
}
/*virtual*/ void SkScrollBarView::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 SkScrollBarView::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 SkScrollBarView::onEvent(const SkEvent& evt)
{
if (evt.isType(SK_EventType_Inval))
{
this->inval(NULL);
return true;
}
if (evt.isType("recommendDim"))
{
SkScalar width;
if (evt.findScalar("x", &width))
this->setWidth(width);
return true;
}
return this->INHERITED::onEvent(evt);
}
void SkScrollBarView::adjust()
{
int total = fTotalLength;
int start = fStartPoint;
int shown = fShownLength;
int hideBar = 0;
if (total <= 0 || shown <= 0 || shown >= total) // no bar to show
{
total = 1; // avoid divide-by-zero. should be done by skin/script
hideBar = 1; // signal we don't want a thumb
}
else
{
if (start + shown > total)
start = total - shown;
}
SkEvent e("user");
e.setString("id", "adjustScrollBar");
e.setScalar("_totalLength", SkIntToScalar(total));
e.setScalar("_startPoint", SkIntToScalar(start));
e.setScalar("_shownLength", SkIntToScalar(shown));
// e.setS32("hideBar", hideBar);
fAnim.doUserEvent(e);
}