Home | History | Annotate | Download | only in animated
      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 
     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 
     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 
     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 
     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 
     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(NULL);
     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(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 
    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