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