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