diff options
Diffstat (limited to 'Src/Wasabi/api/wnd/wndclass/guiobjwnd.cpp')
-rw-r--r-- | Src/Wasabi/api/wnd/wndclass/guiobjwnd.cpp | 476 |
1 files changed, 476 insertions, 0 deletions
diff --git a/Src/Wasabi/api/wnd/wndclass/guiobjwnd.cpp b/Src/Wasabi/api/wnd/wndclass/guiobjwnd.cpp new file mode 100644 index 00000000..fcb70d0c --- /dev/null +++ b/Src/Wasabi/api/wnd/wndclass/guiobjwnd.cpp @@ -0,0 +1,476 @@ +#include <precomp.h> +#include <api/script/api_maki.h> +#include <api/wnd/wndclass/guiobjwnd.h> +#include <api/script/scriptobj.h> +#include <api/script/scriptguid.h> +#include <api/service/svcs/svc_droptarget.h> +#include <api/wnd/notifmsg.h> +#include <api/script/objects/rootobject.h> +#include <api/locales/xlatstr.h> + +XMLParamPair GuiObjectWnd::params[] = + { + {GUIOBJECT_ACTIVEALPHA, L"ACTIVEALPHA"}, + {GUIOBJECT_ALPHA, L"ALPHA"}, + {GUIOBJECT_SETANCHOR, L"ANCHOR"}, +#ifdef USEAPPBAR + {GUIOBJECT_APPBAR, L"APPBAR"}, +#endif + {GUIOBJECT_CFGATTR, L"CFGATTRIB"}, + {GUIOBJECT_SETCURSOR, L"CURSOR"}, + {GUIOBJECT_DROPTARGET, L"DROPTARGET"}, + {GUIOBJECT_ENABLED, L"ENABLED"}, + {GUIOBJECT_FITTOPARENT, L"FITPARENT"}, + {GUIOBJECT_FOCUSONCLICK, L"FOCUSONCLICK"}, + {GUIOBJECT_GHOST, L"GHOST"}, + {GUIOBJECT_H, L"H"}, + {GUIOBJECT_ID, L"ID"}, + {GUIOBJECT_INACTIVEALPHA, L"INACTIVEALPHA"}, + {GUIOBJECT_MOVE, L"MOVE"}, + {GUIOBJECT_SETNOCONTEXTMENU, L"NOCONTEXTMENU"}, + {GUIOBJECT_SETNODBLCLICK, L"NODBLCLICK"}, + {GUIOBJECT_SETNOLEFTCLICK, L"NOLEFTCLICK"}, + {GUIOBJECT_SETNOMOUSEMOVE, L"NOMOUSEMOVE"}, + {GUIOBJECT_SETNORIGHTCLICK, L"NORIGHTCLICK"}, + {GUIOBJECT_NOTIFY, L"NOTIFY"}, + {GUIOBJECT_NOTIFY, L"NOTIFY0"}, + {GUIOBJECT_NOTIFY, L"NOTIFY1"}, + {GUIOBJECT_NOTIFY, L"NOTIFY2"}, + {GUIOBJECT_NOTIFY, L"NOTIFY3"}, + {GUIOBJECT_NOTIFY, L"NOTIFY4"}, + {GUIOBJECT_NOTIFY, L"NOTIFY5"}, + {GUIOBJECT_NOTIFY, L"NOTIFY6"}, + {GUIOBJECT_NOTIFY, L"NOTIFY7"}, + {GUIOBJECT_NOTIFY, L"NOTIFY8"}, + {GUIOBJECT_NOTIFY, L"NOTIFY9"}, + {GUIOBJECT_RECTRGN, L"RECTRGN"}, + {GUIOBJECT_SYSREGION, L"REGIONOP"}, + {GUIOBJECT_RELATH, L"RELATH"}, + {GUIOBJECT_RELATW, L"RELATW"}, + {GUIOBJECT_RELATX, L"RELATX"}, + {GUIOBJECT_RELATY, L"RELATY"}, + {GUIOBJECT_RENDERBASETEXTURE, L"RENDERBASETEXTURE"}, + {GUIOBJECT_SYSMETRICSX, L"SYSMETRICSX"}, + {GUIOBJECT_SYSMETRICSY, L"SYSMETRICSY"}, + {GUIOBJECT_SYSMETRICSW, L"SYSMETRICSW"}, + {GUIOBJECT_SYSMETRICSH, L"SYSMETRICSH"}, + {GUIOBJECT_SYSREGION, L"SYSREGION"}, + {GUIOBJECT_TABORDER, L"TABORDER"}, + {GUIOBJECT_TOOLTIP, L"TOOLTIP"}, + {GUIOBJECT_TRANSLATE, L"TRANSLATE"}, + {GUIOBJECT_USERDATA, L"USERDATA"}, + {GUIOBJECT_VISIBLE, L"VISIBLE"}, + {GUIOBJECT_W, L"W"}, + {GUIOBJECT_WANTFOCUS, L"WANTFOCUS"}, + {GUIOBJECT_X, L"X"}, + {GUIOBJECT_SETX1, L"X1"}, + {GUIOBJECT_SETX2, L"X2"}, + {GUIOBJECT_Y, L"Y"}, + {GUIOBJECT_SETY1, L"Y1"}, + {GUIOBJECT_SETY2, L"Y2"}, + }; + +GuiObjectWnd::GuiObjectWnd() +{ + my_gui_object = static_cast<GuiObject *>(WASABI_API_MAKI->maki_encapsulate(guiObjectGuid, getScriptObject())); + getScriptObject()->vcpu_setInterface(xmlObjectGuid, static_cast<XmlObject *>(this)); + getScriptObject()->vcpu_setInterface(guiObjectWndGuid, static_cast<GuiObjectWnd *>(this)); +#ifdef USEAPPBAR + getScriptObject()->vcpu_setInterface(appBarGuid, static_cast<AppBar*>(this)); +#endif + my_gui_object->guiobject_setRootWnd(this); + getScriptObject()->vcpu_setClassName(L"GuiObject"); + getScriptObject()->vcpu_setController(WASABI_API_MAKI->maki_getController(guiObjectGuid)); + cfg_reentry = 0; + xuihandle = newXuiHandle(); + CreateXMLParameters(xuihandle); +} + +void GuiObjectWnd::CreateXMLParameters(int master_handle) +{ + int numParams = sizeof(params) / sizeof(params[0]); + hintNumberOfParams(xuihandle, numParams); + for (int i = 0;i < numParams;i++) + addParam(xuihandle, params[i], XUI_ATTRIBUTE_IMPLIED); +} + +GuiObjectWnd::~GuiObjectWnd() +{ + WASABI_API_MAKI->maki_deencapsulate(guiObjectGuid, my_gui_object); + my_gui_object = NULL; +} + +const wchar_t *GuiObjectWnd::getTip() +{ + switch(wantTranslation()) + { + case 1: + return _(tip); + case 2: +return __(tip); + default: + return tip; + } +} + +int GuiObjectWnd::onRightButtonDown(int x, int y) +{ + if (!my_gui_object) return 1; + GUIOBJECTWND_PARENT::onRightButtonDown(x, y); + my_gui_object->guiobject_onRightButtonDown(x, y); + return 1; +} + +int GuiObjectWnd::onRightButtonUp(int x, int y) +{ + if (!my_gui_object) return 1; + GUIOBJECTWND_PARENT::onRightButtonUp(x, y); + my_gui_object->guiobject_onRightButtonUp(x, y); + return 1; +} + +int GuiObjectWnd::onLeftButtonDown(int x, int y) +{ + if (!my_gui_object) return 1; + GUIOBJECTWND_PARENT::onLeftButtonDown(x, y); + my_gui_object->guiobject_onLeftButtonDown(x, y); + return 1; +} + +int GuiObjectWnd::onLeftButtonUp(int x, int y) +{ + if (!my_gui_object) return 1; + GUIOBJECTWND_PARENT::onLeftButtonUp(x, y); + my_gui_object->guiobject_onLeftButtonUp(x, y); + return 1; +} + +int GuiObjectWnd::onMouseMove(int x, int y) +{ + if (!my_gui_object) return 1; + GUIOBJECTWND_PARENT::onMouseMove(x, y); + my_gui_object->guiobject_onMouseMove(x, y); + return 1; +} + +int GuiObjectWnd::wantTranslation() +{ + if (!my_gui_object) return 1; + return my_gui_object->guiobject_wantTranslation(); +} + +int GuiObjectWnd::onLeftButtonDblClk(int x, int y) +{ + if (!my_gui_object) return 1; + GUIOBJECTWND_PARENT::onLeftButtonDblClk(x, y); + my_gui_object->guiobject_onLeftButtonDblClk(x, y); + return 1; +} + +int GuiObjectWnd::onRightButtonDblClk(int x, int y) +{ + if (!my_gui_object) return 1; + GUIOBJECTWND_PARENT::onRightButtonDblClk(x, y); + my_gui_object->guiobject_onRightButtonDblClk(x, y); + return 1; +} + +// Martin> For the next two functions, we need to ensure that we don't kill volume change if nothing is done +int GuiObjectWnd::onMouseWheelDown (int click, int line) +{ + if (!my_gui_object) return 1; + int ret = GUIOBJECTWND_PARENT::onMouseWheelDown(click, line); + if (!ret) ret = my_gui_object->guiobject_onMouseWheelDown(click, line); + return ret; +} + +int GuiObjectWnd::onMouseWheelUp (int click, int line) +{ + if (!my_gui_object) return 1; + int ret = GUIOBJECTWND_PARENT::onMouseWheelUp(click, line); + if (!ret) ret = my_gui_object->guiobject_onMouseWheelUp(click, line); + return ret; +} + +int GuiObjectWnd::onResize() +{ + if (!my_gui_object) return 1; + GUIOBJECTWND_PARENT::onResize(); + if (!isInited()) return 1; + ifc_window *w = my_gui_object->guiobject_getRootWnd(); + RECT r; + w->getClientRect(&r); + my_gui_object->guiobject_onResize(r.left, r.top, r.right - r.left, r.bottom - r.top); + return 1; +} + +void GuiObjectWnd::onEnterArea() +{ + if (!my_gui_object) return ; + GUIOBJECTWND_PARENT::onEnterArea(); + my_gui_object->guiobject_onEnterArea(); +} + +void GuiObjectWnd::onLeaveArea() +{ + if (!my_gui_object) return ; + GUIOBJECTWND_PARENT::onLeaveArea(); + my_gui_object->guiobject_onLeaveArea(); +} + +void GuiObjectWnd::onSetVisible(int show) +{ + if (!my_gui_object) + return ; + + GUIOBJECTWND_PARENT::onSetVisible(show); + my_gui_object->guiobject_onSetVisible(show); +} + +int GuiObjectWnd::onEnable(int en) +{ + if (!my_gui_object) return 1; + GUIOBJECTWND_PARENT::onEnable(en); + my_gui_object->guiobject_onEnable(en); + return 1; +} + +GuiObject *GuiObjectWnd::getGuiObject() +{ + return my_gui_object; +} + +RootObject *GuiObjectWnd::getRootObject() +{ + return my_gui_object->guiobject_getRootObject(); +} + +int GuiObjectWnd::dragDrop(ifc_window *sourceWnd, int x, int y) +{ + int r = DropTargetEnum::throwDrop(my_gui_object->guiobject_getDropTarget(), sourceWnd, x, y); + if (r == 0) + { + ifc_window *p = getParent(); + if (p != NULL) + { + DragInterface *d = p->getDragInterface(); + if (d != NULL) + return d->dragDrop(sourceWnd, x, y); + } + } + return r; +} + +int GuiObjectWnd::dragEnter(ifc_window *sourceWnd) +{ + my_gui_object->guiobject_dragEnter(sourceWnd); + return 1; +} + +int GuiObjectWnd::dragOver(int x, int y, ifc_window *sourceWnd) +{ + my_gui_object->guiobject_dragOver(x, y, sourceWnd); + return 1; +} + +int GuiObjectWnd::dragLeave(ifc_window *sourceWnd) +{ + my_gui_object->guiobject_dragLeave(sourceWnd); + return 1; +} + +int GuiObjectWnd::onActivate() +{ + if (!my_gui_object) return 1; + GUIOBJECTWND_PARENT::onActivate(); + invalidate(); + return 1; +} + +int GuiObjectWnd::onDeactivate() +{ + if (!my_gui_object) return 1; + GUIOBJECTWND_PARENT::onDeactivate(); + invalidate(); + return 1; +} + +void GuiObjectWnd::onCancelCapture() +{ + if (!my_gui_object) return ; + GUIOBJECTWND_PARENT::onCancelCapture(); + my_gui_object->guiobject_onCancelCapture(); +} + +int GuiObjectWnd::setXuiParam(int _xuihandle, int attrid, const wchar_t *name, const wchar_t *value) +{ + if (_xuihandle == xuihandle) + { + switch (attrid) + { + case GUIOBJECT_FOCUSONCLICK: + setFocusOnClick(WTOI(value)); + break; + default: + getGuiObject()->guiobject_setXmlParamById(attrid, value); + break; + } + } + return 0; +} + +int GuiObjectWnd::onUnknownXmlParam(const wchar_t *param, const wchar_t *value) +{ + return onUnknownXuiParam(param, value); +} + +int GuiObjectWnd::setXmlParamById(int xmlhandle, int attrid, const wchar_t *name, const wchar_t *value) +{ + return setXuiParam(xmlhandle, attrid, name, value); +} + +void *GuiObjectWnd::getInterface(GUID interface_guid) +{ + void *r = GUIOBJECTWND_PARENT::getInterface(interface_guid); + if (r) return r; + return getRootObject()->rootobject_getScriptObject()->vcpu_getInterface(interface_guid); +} + +int GuiObjectWnd::onAction(const wchar_t *action, const wchar_t *param, int x, int y, intptr_t p1, intptr_t p2, void *data, size_t datalen, ifc_window *source) +{ +#ifdef WASABI_COMPILE_CONFIG + if (!_wcsicmp(action, L"reload_config") && isInited()) + { + if (cfg_reentry) return 1; + cfg_reentry = 1; + int r = onReloadConfig(); + cfg_reentry = 0; + return r; + } +#endif + int rt = GUIOBJECTWND_PARENT::onAction(action, param, x, y, p1, p2, data, datalen, source); + getGuiObject()->guiobject_onAction(action, param, x, y, p1, p2, data, datalen, source); + return rt; +} + +void GuiObjectWnd::setContent(const wchar_t *groupid_orguid, int autoresizefromcontent) +{ +#ifdef WASABI_COMPILE_SKIN + + // abstract_setAllowDeferredContent(0); + abstract_setContent(groupid_orguid, autoresizefromcontent); +#endif +} + +void GuiObjectWnd::setContentBySkinItem(SkinItem *item, int autoresizefromcontent) +{ + // abstract_setAllowDeferredContent(0); +#ifdef WASABI_COMPILE_SKIN + abstract_setContentBySkinItem(item, autoresizefromcontent); +#endif +} + +void GuiObjectWnd::abstract_onNewContent() +{ + +#ifdef WASABI_COMPILE_SKIN + GUIOBJECTWND_PARENT::abstract_onNewContent(); +#endif + onNewContent(); +#ifdef WASABI_COMPILE_CONFIG + if (getGuiObject()->guiobject_hasCfgAttrib()) + onReloadConfig(); +#endif +} + +GuiObject *GuiObjectWnd::findObject(const wchar_t *object_id) +{ + return getGuiObject()->guiobject_findObject(object_id); +} + +#ifdef WASABI_COMPILE_SCRIPT +ScriptObject *GuiObjectWnd::findScriptObject(const wchar_t *object_id) +{ + GuiObject *fo = getGuiObject()->guiobject_findObject(object_id); + if (fo != NULL) return fo->guiobject_getScriptObject(); + return NULL; +} +#endif +const wchar_t *GuiObjectWnd::getId() +{ + if (my_gui_object) + return my_gui_object->guiobject_getId(); + return GUIOBJECTWND_PARENT::getId(); +} + +int GuiObjectWnd::onPostOnInit() +{ + int r = GUIOBJECTWND_PARENT::onPostOnInit(); +#ifdef WASABI_COMPILE_CONFIG + if (getGuiObject()->guiobject_hasCfgAttrib()) + onReloadConfig(); +#endif + return r; +} + +int GuiObjectWnd::onInit() +{ + int r = GUIOBJECTWND_PARENT::onInit(); + getGuiObject()->guiobject_onInit(); + return r; +} + +int GuiObjectWnd::onChar(unsigned int c) +{ + if (!my_gui_object) return 1; + int r = GUIOBJECTWND_PARENT::onChar(c); + getGuiObject()->guiobject_onChar(c); + return r; +} + +int GuiObjectWnd::onKeyDown(int vkcode) +{ + if (!my_gui_object) return 1; + int r = GUIOBJECTWND_PARENT::onKeyDown(vkcode); + getGuiObject()->guiobject_onKeyDown(vkcode); + return r; +} + +int GuiObjectWnd::onKeyUp(int vkcode) +{ + if (!my_gui_object) return 1; + int r = GUIOBJECTWND_PARENT::onKeyUp(vkcode); + getGuiObject()->guiobject_onKeyUp(vkcode); + return r; +} + +int GuiObjectWnd::onGetFocus() +{ + if (!my_gui_object) return 1; + int r = GUIOBJECTWND_PARENT::onGetFocus(); + getGuiObject()->guiobject_onGetFocus(); + return r; +} + +int GuiObjectWnd::onKillFocus() +{ + if (!my_gui_object) return 1; + int r = GUIOBJECTWND_PARENT::onKillFocus(); + getGuiObject()->guiobject_onKillFocus(); + return r; +} + +int GuiObjectWnd::onAcceleratorEvent(const wchar_t *name) +{ + int r = GUIOBJECTWND_PARENT::onAcceleratorEvent(name); + getGuiObject()->guiobject_onAccelerator(name); + return r; +} + +int GuiObjectWnd::wantFocus() +{ + if (GUIOBJECTWND_PARENT::wantFocus()) return 1; + if (my_gui_object) + return my_gui_object->guiobject_wantFocus(); + return 0; +} |