winamp/Src/Wasabi/api/script/objects/svcwnd.cpp
2024-09-24 14:54:57 +02:00

240 lines
6.4 KiB
C++

#include "precomp.h"
#include "../../bfc/std.h"
#include "script.h"
#include "scriptmgr.h"
#include "../../bfc/notifmsg.h"
#include "../../common/script/scriptobj.h"
#include "compoobj.h"
#include "../api.h"
#include "vcpu.h"
#include "../smap.h"
#include "../skinparse.h"
#include "svcwnd.h"
#include "../services/services.h"
#include "../services/servicei.h"
#include "../svcmgr.h"
#include "../services/svc_wndcreate.h"
char svcWndXuiObjectStr[] = "SvcWnd"; // This is the xml tag
char svcWndXuiSvcName[] = "SvcWnd xui object"; // this is the name of the xuiservice
SvcWndScriptController _svcWndController;
SvcWndScriptController *svcWndController = &_svcWndController;
// -- Functions table -------------------------------------
function_descriptor_struct SvcWndScriptController::exportedFunction[] = {
{"getGUID", 1, (void*)SvcWnd::script_vcpu_getGUID },
{"getWac", 0, (void*)SvcWnd::script_vcpu_getWac },
};
// --------------------------------------------------------
const wchar_t *SvcWndScriptController::getClassName() {
return L"SvcGuiObject";
}
const wchar_t *SvcWndScriptController::getAncestorClassName() {
return "GuiObject";
}
int SvcWndScriptController::getNumFunctions() {
return sizeof(exportedFunction) / sizeof(function_descriptor_struct);
}
const function_descriptor_struct *SvcWndScriptController::getExportedFunctions() {
return exportedFunction;
}
GUID SvcWndScriptController::getClassGuid() {
return svcWndGuid;
}
ScriptObject *SvcWndScriptController::instantiate() {
SvcWnd *sv = new SvcWnd();
ASSERT(sv != NULL);
return sv->getScriptObject();
}
void SvcWndScriptController::destroy(ScriptObject *o) {
SvcWnd *obj = static_cast<SvcWnd*>(o->vcpu_getInterface(svcWndGuid));
ASSERT(obj != NULL);
delete obj;
}
void *SvcWndScriptController::encapsulate(ScriptObject *o) {
return NULL; // no encapsulation for svcwnd yet
}
void SvcWndScriptController::deencapsulate(void *o) {
}
char SvcWndParams[][] =
{
"DBLCLICKACTION", //SVCWND_DBLCLKACTION
"GUID" // SVCWND_GUID
};
SvcWnd::SvcWnd() {
getScriptObject()->vcpu_setInterface(svcWndGuid, (void *)static_cast<SvcWnd*>(this));
getScriptObject()->vcpu_setClassName("SvcGuiObject");
getScriptObject()->vcpu_setController(svcWndController);
myGUID = INVALID_GUID;
svcwnd = NULL;
svc = NULL;
forwarded = 0;
xuihandle = newXuiHandle();
addParam(xuihandle, SvcWndParams[0], SVCWND_DBLCLKACTION, XUI_ATTRIBUTE_IMPLIED);
addParam(xuihandle, SvcWndParams[1], SVCWND_GUID, XUI_ATTRIBUTE_IMPLIED);
}
// servicewnd to svcwnd
int SvcWnd::childNotify(api_window *child, int msg, intptr_t param1, intptr_t param2) {
if (child == svcwnd) {
switch (msg) {
case ChildNotify::SVCWND_LBUTTONDOWN:
onLeftButtonDown(param1, param2);
break;
case ChildNotify::SVCWND_RBUTTONDOWN:
onRightButtonDown(param1, param2);
break;
case ChildNotify::SVCWND_LBUTTONUP:
onLeftButtonUp(param1, param2);
break;
case ChildNotify::SVCWND_RBUTTONUP:
onRightButtonUp(param1, param2);
break;
case ChildNotify::SVCWND_LBUTTONDBLCLK:
onLeftButtonDblClk(param1, param2);
break;
case ChildNotify::SVCWND_RBUTTONDBLCLK:
onRightButtonDblClk(param1, param2);
break;
case ChildNotify::SVCWND_MOUSEMOVE:
onMouseMove(param1, param2);
break;
}
forwarded = 0;
} else
return SVCWND_PARENT::childNotify(child, msg, param1, param2);
return 1;
}
// virtualwnd to guiobject bridging
int SvcWnd::onLeftButtonDblClk(int x, int y) {
if(!dblClickAction.isempty()) {
const char *toCheck="SWITCH;";
if(!STRNINCMP(dblClickAction,toCheck)) {
onLeftButtonUp(x,y);
getGuiObject()->guiobject_getParentGroup()->getParentContainer()->switchToLayout(dblClickAction.getValue()+STRLEN(toCheck));
}
}
return SVCWND_PARENT::onLeftButtonDblClk(x, y);
}
int SvcWnd::onResize() {
SVCWND_PARENT::onResize();
RECT r = clientRect();
if (svcwnd)
svcwnd->resize(r.left, r.top, r.right-r.left, r.bottom-r.top);
return 1;
}
void SvcWnd::onSetVisible(int v) {
if (svcwnd) svcwnd->setVisible(v);
SVCWND_PARENT::onSetVisible(v);
}
int SvcWnd::setXuiParam(int _xuihandle, int xmlattributeid, const wchar_t *xmlattributename, const wchar_t *value) {
if (_xuihandle == xuihandle) {
switch (xmlattributeid) {
case SVCWND_GUID: {
GUID *g;
g = SkinParser::getComponentGuid(value);
if (g)
setGUID(*g);
return 1;
}
case SVCWND_DBLCLKACTION:
dblClickAction = value;
return 1;
}
}
return SVCWND_PARENT::setXuiParam(_xuihandle,xmlattributeid,xmlattributename,value);
}
int SvcWnd::onUnknownXuiParam(const wchar_t *param, const wchar_t *value) {
params.addItem(new String(param));
params.addItem(new String(value));
return 0;
}
int SvcWnd::onInit() {
int r = SVCWND_PARENT::onInit();
WindowCreateByGuidEnum wce(getGUID());
for (;;) {
if (!svc)
svc = wce.getNext();
if (!svc) return 0;
svcwnd = svc->createWindowByGuid(getGUID(), this);
if (svcwnd != NULL) break;
SvcEnum::release(svc); svc = NULL;
}
if (svcwnd != NULL)
{
svcwnd->setStartHidden(1);
if (!svcwnd->isInited())
r &= svcwnd->init(this);
if (params.getNumItems() > 0) {
for (int i=0;i<params.getNumItems();i+=2) {
svcwnd->getGuiObject()->guiobject_setXmlParam(params[i]->getValue(), params[i+1]->getValue());
}
}
}
params.deleteAll();
return r;
}
SvcWnd::~SvcWnd() {
if (svc) {
svc->destroyWindow(svcwnd);
ServiceManager::release(svc);
}
}
int SvcWnd::handleRatio() {
return 1; // todo: ask window
}
void SvcWnd::setGUID(GUID g) {
myGUID = g;
}
GUID SvcWnd::getGUID(void) {
return myGUID;
}
int SvcWnd::getPreferences(int what) {
if (svcwnd) return svcwnd->getPreferences(what);
return SVCWND_PARENT::getPreferences(what);
}
scriptVar SvcWnd::script_vcpu_getGUID(SCRIPT_FUNCTION_PARAMS, ScriptObject *o) {
SCRIPT_FUNCTION_INIT;
SvcWnd *s = static_cast<SvcWnd *>(o->vcpu_getInterface(svcWndGuid));
if (s)
return MAKE_SCRIPT_STRING(StringPrintf(s->myGUID));
else
return MAKE_SCRIPT_STRING("");
}
scriptVar SvcWnd::script_vcpu_getWac(SCRIPT_FUNCTION_PARAMS, ScriptObject *o) {
SCRIPT_FUNCTION_INIT;
SvcWnd *s = static_cast<SvcWnd *>(o->vcpu_getInterface(svcWndGuid));
if (s) return MAKE_SCRIPT_OBJECT(SOM::getWACObject(s->getGUID())->getScriptObject());
RETURN_SCRIPT_VOID;
}