180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2011 Google Inc.
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkWidgetViews.h"
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkAnimator.h"
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkCanvas.h"
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkPaint.h"
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkStream.h"
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkSystemEventTypes.h"
1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruI have moved this to SkWidgetViews.h
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruenum SkinEnum {
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    kButton_SkinEnum,
1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    kProgress_SkinEnum,
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    kScroll_SkinEnum,
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    kStaticText_SkinEnum,
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    kSkinEnumCount
2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru*/
2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst char* get_skin_enum_path(SkinEnum se)
2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{
2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkASSERT((unsigned)se < kSkinEnumCount);
3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    static const char* gSkinPaths[] = {
3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            "common/default/default/skins/border3.xml",
3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            "common/default/default/skins/button.xml",
3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            "common/default/default/skins/progressBar.xml",
3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            "common/default/default/skins/scrollBar.xml",
3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            "common/default/default/skins/statictextpaint.xml"
3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    };
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return gSkinPaths[se];
4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
42096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergervoid init_skin_anim(const char path[], SkAnimator* anim) {
4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkASSERT(path && anim);
4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
45096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    SkAutoTUnref<SkStream> stream(SkStream::NewFromFile(path));
46096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    if (!stream.get()) {
4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDEBUGF(("init_skin_anim: loading skin failed <%s>\n", path));
4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        sk_throw();
4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
51096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    if (!anim->decodeStream(stream)) {
5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDEBUGF(("init_skin_anim: decoding skin failed <%s>\n", path));
5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        sk_throw();
5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid init_skin_anim(SkinEnum se, SkAnimator* anim)
5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{
5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    init_skin_anim(get_skin_enum_path(se), anim);
6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid init_skin_paint(SkinEnum se, SkPaint* paint)
6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{
6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkASSERT(paint);
6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkAnimator    anim;
6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkCanvas    canvas;
6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    init_skin_anim(se, &anim);
7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    anim.draw(&canvas, paint, 0);
7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid inflate_paint(const SkDOM& dom, const SkDOM::Node* node, SkPaint* paint)
7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{
7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkASSERT(paint);
7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkAnimator    anim;
7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkCanvas    canvas;
7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (!anim.decodeDOM(dom, node))
8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    {
8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDEBUGF(("inflate_paint: decoding dom failed\n"));
8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDEBUGCODE(dom.dump(node);)
8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        sk_throw();
8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    anim.draw(&canvas, paint, 0);
8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru////////////////////////////////////////////////////////////////////////////////////////
9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkWidgetView::SkWidgetView() : SkView(SkView::kFocusable_Mask | SkView::kEnabled_Mask)
9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{
9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
9480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst char* SkWidgetView::getLabel() const
9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{
9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return fLabel.c_str();
9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkWidgetView::getLabel(SkString* label) const
10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{
10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (label)
10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        *label = fLabel;
10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkWidgetView::setLabel(const char label[])
10780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{
10880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->setLabel(label, label ? strlen(label) : 0);
10980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
11180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkWidgetView::setLabel(const char label[], size_t len)
11280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{
11380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if ((label == NULL && fLabel.size() != 0) || !fLabel.equals(label, len))
11480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    {
11580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkString    tmp(label, len);
11680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
11780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        this->onLabelChange(fLabel.c_str(), tmp.c_str());
11880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fLabel.swap(tmp);
11980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
12080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
12180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
12280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkWidgetView::setLabel(const SkString& label)
12380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{
12480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (fLabel != label)
12580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    {
12680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        this->onLabelChange(fLabel.c_str(), label.c_str());
12780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fLabel = label;
12880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
12980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
13080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
13180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkWidgetView::postWidgetEvent()
13280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{
13380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (!fEvent.isType(""))
13480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    {
13580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkEvent    evt(fEvent);    // make a copy since onPrepareWidgetEvent may edit the event
13680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
13780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (this->onPrepareWidgetEvent(&evt))
13880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        {
13980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkDEBUGCODE(evt.dump("SkWidgetView::postWidgetEvent");)
14080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
14180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            this->postToListeners(evt);    // wonder if this should return true if there are > 0 listeners...
14280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            return true;
14380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
14480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
14580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return false;
14680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
14780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
14880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*virtual*/ void SkWidgetView::onInflate(const SkDOM& dom, const SkDOM::Node* node)
14980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{
15080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->INHERITED::onInflate(dom, node);
15180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
15280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const char* label = dom.findAttr(node, "label");
15380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (label)
15480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        this->setLabel(label);
15580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
15680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if ((node = dom.getFirstChild(node, "event")) != NULL)
15780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fEvent.inflate(dom, node);
15880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
15980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
16080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*virtual*/ void SkWidgetView::onLabelChange(const char oldLabel[], const char newLabel[])
16180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{
16280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->inval(NULL);
16380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
16480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
16580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const char gWidgetEventSinkIDSlotName[] = "sk-widget-sinkid-slot";
16680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
16780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*virtual*/ bool SkWidgetView::onPrepareWidgetEvent(SkEvent* evt)
16880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{
16980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    evt->setS32(gWidgetEventSinkIDSlotName, this->getSinkID());
17080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return true;
17180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
17280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
17380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkEventSinkID SkWidgetView::GetWidgetEventSinkID(const SkEvent& evt)
17480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{
17580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int32_t    sinkID;
17680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
17780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return evt.findS32(gWidgetEventSinkIDSlotName, &sinkID) ? (SkEventSinkID)sinkID : 0;
17880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
17980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
18080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru///////////////////////////////////////////////////////////////////////////////////////////////////
18180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
18280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*virtual*/ bool SkButtonView::onEvent(const SkEvent& evt)
18380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{
18480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (evt.isType(SK_EventType_Key) && evt.getFast32() == kOK_SkKey)
18580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    {
18680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        this->postWidgetEvent();
18780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return true;
18880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
18980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return this->INHERITED::onEvent(evt);
19080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
19180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
19280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru///////////////////////////////////////////////////////////////////////////////////////////////////
19380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
19480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkCheckButtonView::SkCheckButtonView() : fCheckState(kOff_CheckState)
19580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{
19680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
19780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
19880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkCheckButtonView::setCheckState(CheckState state)
19980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{
20080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkASSERT((unsigned)state <= kUnknown_CheckState);
20180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
20280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (fCheckState != state)
20380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    {
20480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        this->onCheckStateChange(this->getCheckState(), state);
20580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fCheckState = SkToU8(state);
20680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
20780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
20880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
20980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*virtual*/ void SkCheckButtonView::onCheckStateChange(CheckState oldState, CheckState newState)
21080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{
21180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->inval(NULL);
21280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
21380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
21480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*virtual*/ void SkCheckButtonView::onInflate(const SkDOM& dom, const SkDOM::Node* node)
21580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{
21680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->INHERITED::onInflate(dom, node);
21780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
21880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int index = dom.findList(node, "check-state", "off,on,unknown");
21980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (index >= 0)
22080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        this->setCheckState((CheckState)index);
22180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
22280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
22380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const char gCheckStateSlotName[] = "sk-checkbutton-check-slot";
22480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
22580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*virtual*/ bool SkCheckButtonView::onPrepareWidgetEvent(SkEvent* evt)
22680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{
22780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // could check if we're "disabled", and return false...
22880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
22980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    evt->setS32(gCheckStateSlotName, this->getCheckState());
23080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return true;
23180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
23280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
23380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkCheckButtonView::GetWidgetEventCheckState(const SkEvent& evt, CheckState* state)
23480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{
23580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int32_t    state32;
23680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
23780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (evt.findS32(gCheckStateSlotName, &state32))
23880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    {
23980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (state)
24080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            *state = (CheckState)state32;
24180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return true;
24280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
24380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return false;
24480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
24580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
24680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru///////////////////////////////////////////////////////////////////////////////////////////////////
24780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru///////////////////////////////////////////////////////////////////////////////////////////////////
24880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru///////////////////////////////////////////////////////////////////////////////////////////////////
24980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
25080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkTime.h"
25180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include <stdio.h>
25280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
25380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkAnimButtonView : public SkButtonView {
25480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
25580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkAnimButtonView()
25680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    {
25780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fAnim.setHostEventSink(this);
25880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        init_skin_anim(kButton_SkinEnum, &fAnim);
25980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
26080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
26180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected:
26280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void onLabelChange(const char oldLabel[], const char newLabel[])
26380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    {
26480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        this->INHERITED::onLabelChange(oldLabel, newLabel);
26580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
26680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkEvent evt("user");
26780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        evt.setString("id", "setLabel");
26880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        evt.setString("LABEL", newLabel);
26980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fAnim.doUserEvent(evt);
27080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
27180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
27280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void onFocusChange(bool gainFocus)
27380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    {
27480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        this->INHERITED::onFocusChange(gainFocus);
27580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
27680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkEvent evt("user");
27780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        evt.setString("id", "setFocus");
27880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        evt.setS32("FOCUS", gainFocus);
27980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fAnim.doUserEvent(evt);
28080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
28180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
28280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void onSizeChange()
28380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    {
28480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        this->INHERITED::onSizeChange();
28580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
28680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkEvent evt("user");
28780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        evt.setString("id", "setDim");
28880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        evt.setScalar("dimX", this->width());
28980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        evt.setScalar("dimY", this->height());
29080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fAnim.doUserEvent(evt);
29180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
29280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
29380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void onDraw(SkCanvas* canvas)
29480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    {
29580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkPaint                        paint;
29680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkAnimator::DifferenceType    diff = fAnim.draw(canvas, &paint, SkTime::GetMSecs());
29780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
29880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (diff == SkAnimator::kDifferent)
29980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            this->inval(NULL);
30080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        else if (diff == SkAnimator::kPartiallyDifferent)
30180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        {
30280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkRect    bounds;
30380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            fAnim.getInvalBounds(&bounds);
30480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            this->inval(&bounds);
30580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
30680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
30780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
30880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual bool onEvent(const SkEvent& evt)
30980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    {
31080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (evt.isType(SK_EventType_Inval))
31180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        {
31280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            this->inval(NULL);
31380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            return true;
31480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
31580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (evt.isType("recommendDim"))
31680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        {
31780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkScalar    height;
31880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
31980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            if (evt.findScalar("y", &height))
32080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                this->setHeight(height);
32180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            return true;
32280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
32380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return this->INHERITED::onEvent(evt);
32480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
32580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
32680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual bool onPrepareWidgetEvent(SkEvent* evt)
32780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    {
32880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (this->INHERITED::onPrepareWidgetEvent(evt))
32980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        {
33080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkEvent    e("user");
33180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            e.setString("id", "handlePress");
33280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            (void)fAnim.doUserEvent(e);
33380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            return true;
33480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
33580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return false;
33680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
33780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
33880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
33980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkAnimator    fAnim;
34080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
34180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    typedef SkButtonView INHERITED;
34280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
34380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
34480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru////////////////////////////////////////////////////////////////////////////////////////////
34580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru////////////////////////////////////////////////////////////////////////////////////////////
34680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
34780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkView* SkWidgetFactory(const char name[])
34880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{
34980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (name == NULL)
35080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return NULL;
35180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
35280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // must be in the same order as the SkSkinWidgetEnum is declared
35380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    static const char* gNames[] = {
35480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        "sk-border",
35580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        "sk-button",
35680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        "sk-image",
35780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        "sk-list",
35880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        "sk-progress",
35980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        "sk-scroll",
36080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        "sk-text"
36180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
36280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    };
36380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
36480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    for (size_t i = 0; i < SK_ARRAY_COUNT(gNames); i++)
36580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (!strcmp(gNames[i], name))
36680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            return SkWidgetFactory((SkWidgetEnum)i);
36780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
36880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return NULL;
36980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
37080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
37180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkImageView.h"
37280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkProgressBarView.h"
37380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkScrollBarView.h"
37480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkBorderView.h"
37580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
37680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkView* SkWidgetFactory(SkWidgetEnum sw)
37780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{
37880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    switch (sw) {
37980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    case kBorder_WidgetEnum:
38080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return new SkBorderView;
38180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    case kButton_WidgetEnum:
38280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return new SkAnimButtonView;
38380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    case kImage_WidgetEnum:
38480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return new SkImageView;
38580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    case kList_WidgetEnum:
38680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return new SkListView;
38780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    case kProgress_WidgetEnum:
38880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return new SkProgressBarView;
38980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    case kScroll_WidgetEnum:
39080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return new SkScrollBarView;
39180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    case kText_WidgetEnum:
39280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return new SkStaticTextView;
39380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    default:
39480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDEBUGFAIL("unknown enum passed to SkWidgetFactory");
39580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        break;
39680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
39780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return NULL;
39880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
399