1685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com 2685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com/* 3685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * Copyright 2011 Google Inc. 4685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * 5685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * found in the LICENSE file. 7685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com */ 8bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkScrollBarView.h" 9bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkAnimator.h" 10bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkWidgetViews.h" 11bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkSystemEventTypes.h" 12bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkTime.h" 13bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 14bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com//see SkProgressBarView.cpp 15bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com//#include "SkWidgetViews.cpp" 16bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 17bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comSkScrollBarView::SkScrollBarView() 18bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{ 19dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com fAnim.setHostEventSink(this); 20dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com init_skin_anim(kScroll_SkinEnum, &fAnim); 21bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 22dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com fTotalLength = 0; 23dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com fStartPoint = 0; 24dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com fShownLength = 0; 25bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 26dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com this->adjust(); 27bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 28bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 29bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comvoid SkScrollBarView::setStart(unsigned start) 30bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{ 31dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com if ((int)start < 0) 32dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com start = 0; 33dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com 34dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com if (fStartPoint != start) 35dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com { 36dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com fStartPoint = start; 37dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com this->adjust(); 38dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com } 39bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 40bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 41bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comvoid SkScrollBarView::setShown(unsigned shown) 42bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{ 43dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com if ((int)shown < 0) 44dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com shown = 0; 45dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com 46dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com if (fShownLength != shown) 47dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com { 48dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com fShownLength = shown; 49dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com this->adjust(); 50dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com } 51bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 52bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 53bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comvoid SkScrollBarView::setTotal(unsigned total) 54bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{ 55dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com if ((int)total < 0) 56dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com total = 0; 57dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com 58dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com if (fTotalLength != total) 59dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com { 60dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com fTotalLength = total; 61dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com this->adjust(); 62dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com } 63bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 64bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 65bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com/* virtual */ void SkScrollBarView::onInflate(const SkDOM& dom, const SkDOM::Node* node) 66bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{ 67dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com this->INHERITED::onInflate(dom, node); 68dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com 69dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com int32_t value; 70dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com if (dom.findS32(node, "total", &value)) 71dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com this->setTotal(value); 72dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com if (dom.findS32(node, "shown", &value)) 73dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com this->setShown(value); 74bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 75bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 76bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com/*virtual*/ void SkScrollBarView::onSizeChange() 77bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{ 78dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com this->INHERITED::onSizeChange(); 79dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com SkEvent evt("user"); 80dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com evt.setString("id", "setDim"); 81dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com evt.setScalar("dimX", this->width()); 82dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com evt.setScalar("dimY", this->height()); 83dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com fAnim.doUserEvent(evt); 84bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 85bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 86bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com/*virtual*/ void SkScrollBarView::onDraw(SkCanvas* canvas) 87bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{ 88dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com SkPaint paint; 89dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com SkAnimator::DifferenceType diff = fAnim.draw(canvas, &paint, SkTime::GetMSecs()); 90dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com 91dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com if (diff == SkAnimator::kDifferent) 92dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com this->inval(NULL); 93dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com else if (diff == SkAnimator::kPartiallyDifferent) 94dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com { 95dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com SkRect bounds; 96dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com fAnim.getInvalBounds(&bounds); 97dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com this->inval(&bounds); 98dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com } 99bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 100bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 101bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com/*virtual*/ bool SkScrollBarView::onEvent(const SkEvent& evt) 102bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{ 103dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com if (evt.isType(SK_EventType_Inval)) 104dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com { 105dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com this->inval(NULL); 106dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com return true; 107dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com } 108dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com if (evt.isType("recommendDim")) 109dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com { 110dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com SkScalar width; 111dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com 112dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com if (evt.findScalar("x", &width)) 113dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com this->setWidth(width); 114dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com return true; 115dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com } 116dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com 117dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com return this->INHERITED::onEvent(evt); 118bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 119bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 120bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comvoid SkScrollBarView::adjust() 121bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{ 122dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com int total = fTotalLength; 123dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com int start = fStartPoint; 124dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com int shown = fShownLength; 1254927640233ebcd54d09e2517692ada57cb69ce55sugoi@google.com// int hideBar = 0; 126dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com 127dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com if (total <= 0 || shown <= 0 || shown >= total) // no bar to show 128dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com { 129dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com total = 1; // avoid divide-by-zero. should be done by skin/script 1304927640233ebcd54d09e2517692ada57cb69ce55sugoi@google.com// hideBar = 1; // signal we don't want a thumb 131dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com } 132dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com else 133dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com { 134dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com if (start + shown > total) 135dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com start = total - shown; 136dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com } 137dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com 138dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com SkEvent e("user"); 139dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com e.setString("id", "adjustScrollBar"); 140dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com e.setScalar("_totalLength", SkIntToScalar(total)); 141dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com e.setScalar("_startPoint", SkIntToScalar(start)); 142dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com e.setScalar("_shownLength", SkIntToScalar(shown)); 143dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com// e.setS32("hideBar", hideBar); 144dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com fAnim.doUserEvent(e); 145bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 146