|  |  | 
|  | /* | 
|  | * Copyright 2011 Google Inc. | 
|  | * | 
|  | * Use of this source code is governed by a BSD-style license that can be | 
|  | * found in the LICENSE file. | 
|  | */ | 
|  | #include "SkProgressBarView.h" | 
|  | #include "SkAnimator.h" | 
|  | #include "SkWidgetViews.h" | 
|  | #include "SkTime.h" | 
|  | #include "SkSystemEventTypes.h" | 
|  |  | 
|  | SkProgressBarView::SkProgressBarView() | 
|  | { | 
|  | init_skin_anim(kProgress_SkinEnum, &fAnim); | 
|  | fAnim.setHostEventSink(this); | 
|  | fProgress = 0; | 
|  | fMax = 100; | 
|  |  | 
|  | } | 
|  |  | 
|  | void SkProgressBarView::changeProgress(int diff) | 
|  | { | 
|  | int newProg = fProgress + diff; | 
|  | if (newProg > 0 && newProg < fMax) | 
|  | this->setProgress(newProg); | 
|  | //otherwise i'll just leave it as it is | 
|  | //this implies that if a new max and progress are set, max must be set first | 
|  | } | 
|  |  | 
|  | /*virtual*/ void SkProgressBarView::onDraw(SkCanvas* canvas) | 
|  | { | 
|  | SkPaint                        paint; | 
|  | SkAnimator::DifferenceType    diff = fAnim.draw(canvas, &paint, SkTime::GetMSecs()); | 
|  |  | 
|  | if (diff == SkAnimator::kDifferent) | 
|  | this->inval(NULL); | 
|  | else if (diff == SkAnimator::kPartiallyDifferent) | 
|  | { | 
|  | SkRect    bounds; | 
|  | fAnim.getInvalBounds(&bounds); | 
|  | this->inval(&bounds); | 
|  | } | 
|  | } | 
|  |  | 
|  | /*virtual*/ bool SkProgressBarView::onEvent(const SkEvent& evt) | 
|  | { | 
|  | if (evt.isType(SK_EventType_Inval)) | 
|  | { | 
|  | this->inval(NULL); | 
|  | return true; | 
|  | } | 
|  | if (evt.isType("recommendDim")) | 
|  | { | 
|  | SkScalar    height; | 
|  |  | 
|  | if (evt.findScalar("y", &height)) | 
|  | this->setHeight(height); | 
|  | return true; | 
|  | } | 
|  | return this->INHERITED::onEvent(evt); | 
|  | } | 
|  |  | 
|  | /*virtual*/ void SkProgressBarView::onInflate(const SkDOM& dom, const SkDOM::Node* node) | 
|  | { | 
|  | this->INHERITED::onInflate(dom, node); | 
|  | int32_t temp; | 
|  | if (dom.findS32(node, "max", &temp)) | 
|  | this->setMax(temp); | 
|  | if (dom.findS32(node, "progress", &temp)) | 
|  | this->setProgress(temp); | 
|  | } | 
|  |  | 
|  | /*virtual*/ void SkProgressBarView::onSizeChange() | 
|  | { | 
|  | this->INHERITED::onSizeChange(); | 
|  | SkEvent evt("user"); | 
|  | evt.setString("id", "setDim"); | 
|  | evt.setScalar("dimX", this->width()); | 
|  | evt.setScalar("dimY", this->height()); | 
|  | fAnim.doUserEvent(evt); | 
|  | } | 
|  |  | 
|  | void SkProgressBarView::reset() | 
|  | { | 
|  | fProgress = 0; | 
|  | SkEvent e("user"); | 
|  | e.setString("id", "reset"); | 
|  | fAnim.doUserEvent(e); | 
|  | } | 
|  |  | 
|  | void SkProgressBarView::setMax(int max) | 
|  | { | 
|  | fMax = max; | 
|  | SkEvent e("user"); | 
|  | e.setString("id", "setMax"); | 
|  | e.setS32("newMax", max); | 
|  | fAnim.doUserEvent(e); | 
|  | } | 
|  |  | 
|  | void SkProgressBarView::setProgress(int progress) | 
|  | { | 
|  | fProgress = progress; | 
|  | SkEvent e("user"); | 
|  | e.setString("id", "setProgress"); | 
|  | e.setS32("newProgress", progress); | 
|  | fAnim.doUserEvent(e); | 
|  | } |