Home | History | Annotate | Download | only in views
      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 
     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 
     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 
     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 
     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 
     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 
     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 
     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 
     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 
    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