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