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