#include #include "mouseredir.h" #include #include #include #include const wchar_t mouseRedirXuiObjectStr[] = L"MouseRedir"; // This is the xml tag char mouseRedirXuiSvcName[] = "MouseRedir xui object"; // this is the name of the xuiservice XMLParamPair MouseRedir::params[] = { {MOUSEREDIR_TARGET, L"target"}, }; MouseRedir::MouseRedir() { getScriptObject()->vcpu_setInterface(mouseredirGuid, (void *)static_cast(this)); getScriptObject()->vcpu_setClassName(L"MouseRedir"); getScriptObject()->vcpu_setController(mouseredirController); rgn = NULL; redirobject = NULL; getGuiObject()->guiobject_setClickThrough(0); xuihandle = newXuiHandle(); CreateXMLParameters(xuihandle); } void MouseRedir::CreateXMLParameters(int master_handle) { //MOUSEREDIR_PARENT::CreateXMLParameters(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_REQUIRED); } MouseRedir::~MouseRedir() { delete rgn; } int MouseRedir::setXuiParam(int _xuihandle, int xmlattributeid, const wchar_t *xmlattributename, const wchar_t *value) { if (_xuihandle == xuihandle) { switch (xmlattributeid) { case MOUSEREDIR_TARGET: setTarget(value); return 1; } } return MOUSEREDIR_PARENT::setXuiParam(_xuihandle, xmlattributeid, xmlattributename, value); } int MouseRedir::onInit() { MOUSEREDIR_PARENT::onInit(); if (!deferedredirobjectid.isempty()) doSetTarget(deferedredirobjectid); deferedredirobjectid = L""; return 1; } int MouseRedir::mouseInRegion(int x, int y) { if (!rgn) return 1; RECT cr; getClientRect(&cr); POINT pt = {x - cr.left, y - cr.top}; return rgn->ptInRegion(&pt); } void MouseRedir::setRedirection(GuiObject *o) { redirobject = o; } GuiObject *MouseRedir::getRedirection() { return redirobject; } void MouseRedir::setTarget(const wchar_t *id) { if (!isInited()) deferedredirobjectid = id; else doSetTarget(id); } void MouseRedir::doSetTarget(const wchar_t *id) { Group *g = getGuiObject()->guiobject_getParentGroup(); if (!g) return ; GuiObject *o = g->getObject(id); if (!o) return ; redirobject = o; } MouseRedirScriptController _mouseredirController; MouseRedirScriptController *mouseredirController = &_mouseredirController; // -- Functions table ------------------------------------- function_descriptor_struct MouseRedirScriptController::exportedFunction[] = { {L"setRegionFromMap", 1, (void*)MouseRedir::script_vcpu_setRegionFromMap}, {L"setRegion", 1, (void*)MouseRedir::script_vcpu_setRegion }, {L"setRedirection", 1, (void*)MouseRedir::script_vcpu_setRedirection}, {L"getRedirection", 0, (void*)MouseRedir::script_vcpu_getRedirection}, }; // -------------------------------------------------------- const wchar_t *MouseRedirScriptController::getClassName() { return L"MouseRedir"; } const wchar_t *MouseRedirScriptController::getAncestorClassName() { return L"GuiObject"; } ScriptObject *MouseRedirScriptController::instantiate() { MouseRedir *m = new MouseRedir; if (!m) return NULL; return m->getScriptObject(); } void MouseRedirScriptController::destroy(ScriptObject *o) { MouseRedir *obj = static_cast(o->vcpu_getInterface(mouseredirGuid)); ASSERT(obj != NULL); delete obj; } void *MouseRedirScriptController::encapsulate(ScriptObject *o) { return NULL; // no encapsulation for mouseredir yet } void MouseRedirScriptController::deencapsulate(void *) {} int MouseRedirScriptController::getNumFunctions() { return sizeof(exportedFunction) / sizeof(function_descriptor_struct); } const function_descriptor_struct *MouseRedirScriptController::getExportedFunctions() { return exportedFunction; } GUID MouseRedirScriptController::getClassGuid() { return mouseredirGuid; } //--------------------------------------------------------------------------- void MouseRedir::setRegionFromMap(SMap *map, int byte, int inversed) { if (rgn) { delete rgn; rgn = NULL; } rgn = new RegionI(map->getBitmap(), NULL, 0, 0, FALSE, 1, (unsigned char)byte, inversed); } void MouseRedir::setRegion(SRegion *reg) { if (rgn) { delete rgn; rgn = NULL; } if (!reg) { invalidate(); return ; } rgn = new RegionI(); rgn->addRegion(reg->getRegion()); } ifc_window *MouseRedir::getForwardWnd() { if (redirobject) return redirobject->guiobject_getRootWnd(); return this; } scriptVar MouseRedir::script_vcpu_setRedirection(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar obj) { SCRIPT_FUNCTION_INIT; MouseRedir *mr = static_cast(o->vcpu_getInterface(mouseredirGuid)); if (mr) mr->setRedirection(static_cast(GET_SCRIPT_OBJECT_AS(obj, guiObjectGuid))); RETURN_SCRIPT_VOID; } scriptVar MouseRedir::script_vcpu_getRedirection(SCRIPT_FUNCTION_PARAMS, ScriptObject *o) { SCRIPT_FUNCTION_INIT; MouseRedir *mr = static_cast(o->vcpu_getInterface(mouseredirGuid)); return MAKE_SCRIPT_OBJECT(mr ? mr ->getRedirection()->guiobject_getScriptObject() : NULL); } scriptVar MouseRedir::script_vcpu_setRegionFromMap(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar map, scriptVar byte, scriptVar inv) { SCRIPT_FUNCTION_INIT; ASSERT(SOM::isNumeric(&byte)); ASSERT(SOM::isNumeric(&inv)); MouseRedir *mr = static_cast(o->vcpu_getInterface(mouseredirGuid)); SMap *sm = static_cast(GET_SCRIPT_OBJECT_AS(map, mapGuid)); if (mr) mr->setRegionFromMap(sm, SOM::makeInt(&byte), SOM::makeInt(&inv)); RETURN_SCRIPT_VOID; } scriptVar MouseRedir::script_vcpu_setRegion(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar reg) { SCRIPT_FUNCTION_INIT; MouseRedir *mr = static_cast(o->vcpu_getInterface(mouseredirGuid)); SRegion *r = static_cast(GET_SCRIPT_OBJECT_AS(reg, regionGuid)); if (mr) mr->setRegion(r); RETURN_SCRIPT_VOID; }