11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc. 41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 80b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkWidgetViews.h" 90b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkAnimator.h" 100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkCanvas.h" 110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkPaint.h" 120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkStream.h" 130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkSystemEventTypes.h" 140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#ifdef SK_DEBUG 160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger static void assert_no_attr(const SkDOM& dom, const SkDOM::Node* node, const char attr[]) 170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { 180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger const char* value = dom.findAttr(node, attr); 190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (value) 200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkDebugf("unknown attribute %s=\"%s\"\n", attr, value); 210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#else 230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger #define assert_no_attr(dom, node, attr) 240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#endif 250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger/* 260b15698a8c76bb8abc1b555c1d91892669b4118fDerek SollenbergerI have moved this to SkWidgetViews.h 270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerenum SkinEnum { 280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger kButton_SkinEnum, 290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger kProgress_SkinEnum, 300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger kScroll_SkinEnum, 310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger kStaticText_SkinEnum, 320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger kSkinEnumCount 340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}; 350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger*/ 360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerconst char* get_skin_enum_path(SkinEnum se) 380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{ 390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkASSERT((unsigned)se < kSkinEnumCount); 400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger static const char* gSkinPaths[] = { 420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger "common/default/default/skins/border3.xml", 430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger "common/default/default/skins/button.xml", 440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger "common/default/default/skins/progressBar.xml", 450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger "common/default/default/skins/scrollBar.xml", 460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger "common/default/default/skins/statictextpaint.xml" 470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger }; 480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return gSkinPaths[se]; 500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergervoid init_skin_anim(const char path[], SkAnimator* anim) 530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{ 540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkASSERT(path && anim); 550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkFILEStream stream(path); 570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (!stream.isValid()) 590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { 600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkDEBUGF(("init_skin_anim: loading skin failed <%s>\n", path)); 610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger sk_throw(); 620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (!anim->decodeStream(&stream)) 650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { 660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkDEBUGF(("init_skin_anim: decoding skin failed <%s>\n", path)); 670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger sk_throw(); 680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergervoid init_skin_anim(SkinEnum se, SkAnimator* anim) 720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{ 730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger init_skin_anim(get_skin_enum_path(se), anim); 740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergervoid init_skin_paint(SkinEnum se, SkPaint* paint) 770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{ 780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkASSERT(paint); 790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkAnimator anim; 810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkCanvas canvas; 820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger init_skin_anim(se, &anim); 840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger anim.draw(&canvas, paint, 0); 850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergervoid inflate_paint(const SkDOM& dom, const SkDOM::Node* node, SkPaint* paint) 880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{ 890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkASSERT(paint); 900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkAnimator anim; 920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkCanvas canvas; 930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (!anim.decodeDOM(dom, node)) 950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { 960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkDEBUGF(("inflate_paint: decoding dom failed\n")); 970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkDEBUGCODE(dom.dump(node);) 980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger sk_throw(); 990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger anim.draw(&canvas, paint, 0); 1010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 1020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger//////////////////////////////////////////////////////////////////////////////////////// 1040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1050b15698a8c76bb8abc1b555c1d91892669b4118fDerek SollenbergerSkWidgetView::SkWidgetView() : SkView(SkView::kFocusable_Mask | SkView::kEnabled_Mask) 1060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{ 1070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 1080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerconst char* SkWidgetView::getLabel() const 1100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{ 1110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return fLabel.c_str(); 1120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 1130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergervoid SkWidgetView::getLabel(SkString* label) const 1150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{ 1160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (label) 1170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger *label = fLabel; 1180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 1190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergervoid SkWidgetView::setLabel(const char label[]) 1210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{ 1220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger this->setLabel(label, label ? strlen(label) : 0); 1230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 1240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergervoid SkWidgetView::setLabel(const char label[], size_t len) 1260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{ 1270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if ((label == NULL && fLabel.size() != 0) || !fLabel.equals(label, len)) 1280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { 1290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkString tmp(label, len); 1300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger this->onLabelChange(fLabel.c_str(), tmp.c_str()); 1320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger fLabel.swap(tmp); 1330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 1350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergervoid SkWidgetView::setLabel(const SkString& label) 1370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{ 1380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (fLabel != label) 1390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { 1400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger this->onLabelChange(fLabel.c_str(), label.c_str()); 1410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger fLabel = label; 1420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 1440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerbool SkWidgetView::postWidgetEvent() 1460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{ 1470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (!fEvent.isType("")) 1480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { 1490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkEvent evt(fEvent); // make a copy since onPrepareWidgetEvent may edit the event 1500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (this->onPrepareWidgetEvent(&evt)) 1520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { 1530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkDEBUGCODE(evt.dump("SkWidgetView::postWidgetEvent");) 1540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger this->postToListeners(evt); // wonder if this should return true if there are > 0 listeners... 1560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return true; 1570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return false; 1600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 1610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger/*virtual*/ void SkWidgetView::onInflate(const SkDOM& dom, const SkDOM::Node* node) 1630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{ 1640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger this->INHERITED::onInflate(dom, node); 1650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger const char* label = dom.findAttr(node, "label"); 1670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (label) 1680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger this->setLabel(label); 1690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if ((node = dom.getFirstChild(node, "event")) != NULL) 1710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger fEvent.inflate(dom, node); 1720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 1730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger/*virtual*/ void SkWidgetView::onLabelChange(const char oldLabel[], const char newLabel[]) 1750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{ 1760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger this->inval(NULL); 1770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 1780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic const char gWidgetEventSinkIDSlotName[] = "sk-widget-sinkid-slot"; 1800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger/*virtual*/ bool SkWidgetView::onPrepareWidgetEvent(SkEvent* evt) 1820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{ 1830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger evt->setS32(gWidgetEventSinkIDSlotName, this->getSinkID()); 1840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return true; 1850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 1860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1870b15698a8c76bb8abc1b555c1d91892669b4118fDerek SollenbergerSkEventSinkID SkWidgetView::GetWidgetEventSinkID(const SkEvent& evt) 1880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{ 1890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger int32_t sinkID; 1900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return evt.findS32(gWidgetEventSinkIDSlotName, &sinkID) ? (SkEventSinkID)sinkID : 0; 1920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 1930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger/////////////////////////////////////////////////////////////////////////////////////////////////// 1950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger/*virtual*/ bool SkButtonView::onEvent(const SkEvent& evt) 1970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{ 1980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (evt.isType(SK_EventType_Key) && evt.getFast32() == kOK_SkKey) 1990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { 2000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger this->postWidgetEvent(); 2010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return true; 2020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 2030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return this->INHERITED::onEvent(evt); 2040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 2050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger/////////////////////////////////////////////////////////////////////////////////////////////////// 2070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2080b15698a8c76bb8abc1b555c1d91892669b4118fDerek SollenbergerSkCheckButtonView::SkCheckButtonView() : fCheckState(kOff_CheckState) 2090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{ 2100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 2110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergervoid SkCheckButtonView::setCheckState(CheckState state) 2130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{ 2140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkASSERT((unsigned)state <= kUnknown_CheckState); 2150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (fCheckState != state) 2170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { 2180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger this->onCheckStateChange(this->getCheckState(), state); 2190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger fCheckState = SkToU8(state); 2200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 2210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 2220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger/*virtual*/ void SkCheckButtonView::onCheckStateChange(CheckState oldState, CheckState newState) 2240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{ 2250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger this->inval(NULL); 2260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 2270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger/*virtual*/ void SkCheckButtonView::onInflate(const SkDOM& dom, const SkDOM::Node* node) 2290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{ 2300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger this->INHERITED::onInflate(dom, node); 2310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger int index = dom.findList(node, "check-state", "off,on,unknown"); 2330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (index >= 0) 2340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger this->setCheckState((CheckState)index); 2350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 2360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic const char gCheckStateSlotName[] = "sk-checkbutton-check-slot"; 2380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger/*virtual*/ bool SkCheckButtonView::onPrepareWidgetEvent(SkEvent* evt) 2400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{ 2410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // could check if we're "disabled", and return false... 2420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger evt->setS32(gCheckStateSlotName, this->getCheckState()); 2440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return true; 2450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 2460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerbool SkCheckButtonView::GetWidgetEventCheckState(const SkEvent& evt, CheckState* state) 2480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{ 2490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger int32_t state32; 2500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (evt.findS32(gCheckStateSlotName, &state32)) 2520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { 2530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (state) 2540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger *state = (CheckState)state32; 2550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return true; 2560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 2570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return false; 2580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 2590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger/////////////////////////////////////////////////////////////////////////////////////////////////// 2610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger/////////////////////////////////////////////////////////////////////////////////////////////////// 2620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger/////////////////////////////////////////////////////////////////////////////////////////////////// 2630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkTime.h" 2650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include <stdio.h> 2660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass SkAnimButtonView : public SkButtonView { 2680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic: 2690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkAnimButtonView() 2700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { 2710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger fAnim.setHostEventSink(this); 2720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger init_skin_anim(kButton_SkinEnum, &fAnim); 2730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 2740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprotected: 2760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual void onLabelChange(const char oldLabel[], const char newLabel[]) 2770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { 2780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger this->INHERITED::onLabelChange(oldLabel, newLabel); 2790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkEvent evt("user"); 2810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger evt.setString("id", "setLabel"); 2820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger evt.setString("LABEL", newLabel); 2830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger fAnim.doUserEvent(evt); 2840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 2850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual void onFocusChange(bool gainFocus) 2870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { 2880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger this->INHERITED::onFocusChange(gainFocus); 2890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkEvent evt("user"); 2910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger evt.setString("id", "setFocus"); 2920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger evt.setS32("FOCUS", gainFocus); 2930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger fAnim.doUserEvent(evt); 2940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 2950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 2960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual void onSizeChange() 2970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { 2980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger this->INHERITED::onSizeChange(); 2990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 3000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkEvent evt("user"); 3010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger evt.setString("id", "setDim"); 3020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger evt.setScalar("dimX", this->width()); 3030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger evt.setScalar("dimY", this->height()); 3040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger fAnim.doUserEvent(evt); 3050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 3060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 3070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual void onDraw(SkCanvas* canvas) 3080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { 3090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPaint paint; 3100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkAnimator::DifferenceType diff = fAnim.draw(canvas, &paint, SkTime::GetMSecs()); 3110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 3120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (diff == SkAnimator::kDifferent) 3130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger this->inval(NULL); 3140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger else if (diff == SkAnimator::kPartiallyDifferent) 3150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { 3160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkRect bounds; 3170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger fAnim.getInvalBounds(&bounds); 3180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger this->inval(&bounds); 3190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 3200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 3210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 3220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual bool onEvent(const SkEvent& evt) 3230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { 3240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (evt.isType(SK_EventType_Inval)) 3250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { 3260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger this->inval(NULL); 3270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return true; 3280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 3290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (evt.isType("recommendDim")) 3300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { 3310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar height; 3320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 3330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (evt.findScalar("y", &height)) 3340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger this->setHeight(height); 3350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return true; 3360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 3370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return this->INHERITED::onEvent(evt); 3380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 3390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 3400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual bool onPrepareWidgetEvent(SkEvent* evt) 3410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { 3420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (this->INHERITED::onPrepareWidgetEvent(evt)) 3430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { 3440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkEvent e("user"); 3450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger e.setString("id", "handlePress"); 3460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger (void)fAnim.doUserEvent(e); 3470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return true; 3480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 3490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return false; 3500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 3510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 3520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprivate: 3530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkAnimator fAnim; 3540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 3550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger typedef SkButtonView INHERITED; 3560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}; 3570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 3580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger//////////////////////////////////////////////////////////////////////////////////////////// 3590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger//////////////////////////////////////////////////////////////////////////////////////////// 3600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 3610b15698a8c76bb8abc1b555c1d91892669b4118fDerek SollenbergerSkView* SkWidgetFactory(const char name[]) 3620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{ 3630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (name == NULL) 3640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return NULL; 3650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 3660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // must be in the same order as the SkSkinWidgetEnum is declared 3670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger static const char* gNames[] = { 3680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger "sk-border", 3690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger "sk-button", 3700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger "sk-image", 3710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger "sk-list", 3720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger "sk-progress", 3730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger "sk-scroll", 3740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger "sk-text" 3750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 3760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger }; 3770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 3780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger for (size_t i = 0; i < SK_ARRAY_COUNT(gNames); i++) 3790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (!strcmp(gNames[i], name)) 3800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return SkWidgetFactory((SkWidgetEnum)i); 3810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 3820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return NULL; 3830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 3840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 3850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkImageView.h" 3860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkProgressBarView.h" 3870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkScrollBarView.h" 3880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkBorderView.h" 3890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 3900b15698a8c76bb8abc1b555c1d91892669b4118fDerek SollenbergerSkView* SkWidgetFactory(SkWidgetEnum sw) 3910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{ 3920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger switch (sw) { 3930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger case kBorder_WidgetEnum: 3940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return new SkBorderView; 3950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger case kButton_WidgetEnum: 3960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return new SkAnimButtonView; 3970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger case kImage_WidgetEnum: 3980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return new SkImageView; 3990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger case kList_WidgetEnum: 4000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return new SkListView; 4010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger case kProgress_WidgetEnum: 4020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return new SkProgressBarView; 4030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger case kScroll_WidgetEnum: 4040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return new SkScrollBarView; 4050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger case kText_WidgetEnum: 4060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return new SkStaticTextView; 4070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger default: 4081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkDEBUGFAIL("unknown enum passed to SkWidgetFactory"); 4090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger break; 4100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 4110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return NULL; 4120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 413