#include "XPCWidget.h" XPCWidget::XPCWidget(int inLeft, int inTop, int inRight, int inBottom, bool inVisible, const char *inDescriptor, bool inIsRoot, XPWidgetID inParent, XPWidgetClass inClass) : mWidget(NULL), mOwnsChildren(false), mOwnsWidget(true) { mWidget = XPCreateWidget(inLeft, inTop, inRight, inBottom, inVisible ? 1 : 0, inDescriptor, inIsRoot ? 1 : 0, inIsRoot ? NULL : inParent, inClass); XPSetWidgetProperty(mWidget, xpProperty_Object, reinterpret_cast(this)); XPAddWidgetCallback(mWidget, WidgetCallback); } XPCWidget::XPCWidget(XPWidgetID inWidget, bool inOwnsWidget) : mWidget(inWidget), mOwnsChildren(false), mOwnsWidget(inOwnsWidget) { XPSetWidgetProperty(mWidget, xpProperty_Object, reinterpret_cast(this)); XPAddWidgetCallback(mWidget, WidgetCallback); } XPCWidget::~XPCWidget() { if (mOwnsWidget) XPDestroyWidget(mWidget, mOwnsChildren ? 1 : 0); } void XPCWidget::SetOwnsWidget(bool inOwnsWidget) { mOwnsWidget = inOwnsWidget; } void XPCWidget::SetOwnsChildren(bool inOwnsChildren) { mOwnsChildren = inOwnsChildren; } XPCWidget::operator XPWidgetID() const { return mWidget; } XPWidgetID XPCWidget::Get(void) const { return mWidget; } void XPCWidget::AddAttachment(XPCWidgetAttachment *inAttachment, bool inOwnsAttachment, bool inPrefilter) { if (inPrefilter) { mAttachments.insert(mAttachments.begin(), AttachmentInfo(inAttachment, inOwnsAttachment)); } else { mAttachments.push_back(AttachmentInfo(inAttachment, inOwnsAttachment)); } } void XPCWidget::RemoveAttachment(XPCWidgetAttachment *inAttachment) { for (AttachmentVector::iterator iter = mAttachments.begin(); iter != mAttachments.end(); ++iter) { if (iter->first == inAttachment) { mAttachments.erase(iter); return; } } } int XPCWidget::HandleWidgetMessage(XPWidgetMessage inMessage, XPWidgetID inWidget, intptr_t inParam1, intptr_t inParam2) { return 0; } int XPCWidget::WidgetCallback(XPWidgetMessage inMessage, XPWidgetID inWidget, intptr_t inParam1, intptr_t inParam2) { XPCWidget *me = reinterpret_cast( XPGetWidgetProperty(inWidget, xpProperty_Object, NULL)); if (me == NULL) return 0; for (AttachmentVector::iterator iter = me->mAttachments.begin(); iter != me->mAttachments.end(); ++iter) { int result = iter->first->HandleWidgetMessage(me, inMessage, inWidget, inParam1, inParam2); if (result != 0) return result; } return me->HandleWidgetMessage(inMessage, inWidget, inParam1, inParam2); }