/* * 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); }