winamp/Src/Wasabi/api/skin/widgets/mouseredir.cpp

222 lines
6.0 KiB
C++

#include <precomp.h>
#include "mouseredir.h"
#include <api/skin/widgets/group.h>
#include <api/script/scriptmgr.h>
#include <api/script/objects/smap.h>
#include <api/script/objects/sregion.h>
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<MouseRedir *>(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<MouseRedir*>(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<MouseRedir *>(o->vcpu_getInterface(mouseredirGuid));
if (mr) mr->setRedirection(static_cast<GuiObject *>(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<MouseRedir *>(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<MouseRedir *>(o->vcpu_getInterface(mouseredirGuid));
SMap *sm = static_cast<SMap*>(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<MouseRedir *>(o->vcpu_getInterface(mouseredirGuid));
SRegion *r = static_cast<SRegion *>(GET_SCRIPT_OBJECT_AS(reg, regionGuid));
if (mr) mr->setRegion(r);
RETURN_SCRIPT_VOID;
}