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