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 
SkScrollBarView()17 SkScrollBarView::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 
setStart(unsigned start)29 void 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 
setShown(unsigned shown)41 void 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 
setTotal(unsigned total)53 void 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 
onInflate(const SkDOM & dom,const SkDOM::Node * node)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 
onSizeChange()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 
onDraw(SkCanvas * canvas)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(NULL);
93     else if (diff == SkAnimator::kPartiallyDifferent)
94     {
95         SkRect    bounds;
96         fAnim.getInvalBounds(&bounds);
97         this->inval(&bounds);
98     }
99 }
100 
onEvent(const SkEvent & evt)101 /*virtual*/ bool SkScrollBarView::onEvent(const SkEvent& evt)
102 {
103     if (evt.isType(SK_EventType_Inval))
104     {
105         this->inval(NULL);
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 
adjust()120 void 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