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