362 lines
11 KiB
C++
362 lines
11 KiB
C++
|
#include "precomp.h"
|
||
|
#ifndef _NOSTUDIO
|
||
|
|
||
|
#include "../../common/std.h"
|
||
|
#include "script.h"
|
||
|
#include "scriptmgr.h"
|
||
|
#include "../../common/script/scriptobj.h"
|
||
|
#include "compoobj.h"
|
||
|
#include "../api.h"
|
||
|
#include "vcpu.h"
|
||
|
#include "../smap.h"
|
||
|
#include "sregion.h"
|
||
|
#include "../skinparse.h"
|
||
|
#include "../compon.h"
|
||
|
#include "../compwnd.h"
|
||
|
#include "../cbmgr.h"
|
||
|
#include "../smap.h"
|
||
|
#include "../../common/wndcb.h"
|
||
|
|
||
|
#else
|
||
|
#include "compoobj.h"
|
||
|
#endif
|
||
|
|
||
|
CompoObjScriptController _compoController;
|
||
|
CompoObjScriptController *compoController=&_compoController;
|
||
|
|
||
|
// -- Functions table -------------------------------------
|
||
|
function_descriptor_struct CompoObjScriptController::exportedFunction[] = {
|
||
|
{"getGUID", 1, (void*)ComponentObject::script_vcpu_getGUID },
|
||
|
{"getWac", 0, (void*)ComponentObject::script_vcpu_getWac },
|
||
|
{"setRegionFromMap", 3, (void*)ComponentObject::script_vcpu_setRegionFromMap },
|
||
|
{"setRegion", 1, (void*)ComponentObject::script_vcpu_setRegion },
|
||
|
{"onGetWac", 1, (void*)ComponentObject::script_vcpu_onGetWac },
|
||
|
{"onGiveUpWac", 1, (void*)ComponentObject::script_vcpu_onGiveUpWac },
|
||
|
{"setAcceptWac", 1, (void*)ComponentObject::script_vcpu_setAcceptWac },
|
||
|
};
|
||
|
// --------------------------------------------------------
|
||
|
|
||
|
const char *CompoObjScriptController::getClassName() {
|
||
|
return "Component";
|
||
|
}
|
||
|
|
||
|
const wchar_t *CompoObjScriptController::getAncestorClassName() {
|
||
|
return "GuiObject";
|
||
|
}
|
||
|
|
||
|
int CompoObjScriptController::getNumFunctions() {
|
||
|
return sizeof(exportedFunction) / sizeof(function_descriptor_struct);
|
||
|
}
|
||
|
|
||
|
const function_descriptor_struct *CompoObjScriptController::getExportedFunctions() {
|
||
|
return exportedFunction;
|
||
|
}
|
||
|
|
||
|
GUID CompoObjScriptController::getClassGuid() {
|
||
|
return componentObjectGuid;
|
||
|
}
|
||
|
|
||
|
ScriptObject *CompoObjScriptController::instantiate() {
|
||
|
ComponentObject *obj = new ComponentObject();
|
||
|
return obj->getScriptObject();
|
||
|
}
|
||
|
|
||
|
void CompoObjScriptController::destroy(ScriptObject *o) {
|
||
|
ComponentObject *obj = static_cast<ComponentObject *>(o->vcpu_getInterface(componentObjectGuid));
|
||
|
ASSERT(obj != NULL);
|
||
|
delete obj;
|
||
|
}
|
||
|
|
||
|
void *CompoObjScriptController::encapsulate(ScriptObject *o) {
|
||
|
return NULL; // no encapsulation for componentobject yet
|
||
|
}
|
||
|
|
||
|
void CompoObjScriptController::deencapsulate(void *) {
|
||
|
}
|
||
|
|
||
|
|
||
|
ComponentObject::ComponentObject() {
|
||
|
getScriptObject()->vcpu_setInterface(componentObjectGuid, (void *)static_cast<ComponentObject *>(this));
|
||
|
getScriptObject()->vcpu_setClassName("Component");
|
||
|
getScriptObject()->vcpu_setController(compoController);
|
||
|
deleting = 0;
|
||
|
compwnd = NULL;
|
||
|
noshowcmdbar = 0;
|
||
|
noshowbtnbar = 0;
|
||
|
MEMCPY(&myGUID, &INVALID_GUID, sizeof(GUID));
|
||
|
MEMCPY(&myCompGuid, &INVALID_GUID, sizeof(GUID));
|
||
|
my_region_clone = NULL;
|
||
|
ComponentManager::registerComponentObject(this);
|
||
|
autoopen = 0;
|
||
|
autoclose = 0;
|
||
|
accept = 1;
|
||
|
denyDesktopAlpha = 0;
|
||
|
denyTransparency = 0;
|
||
|
noanimrects = 0;
|
||
|
}
|
||
|
|
||
|
int ComponentObject::setXmlParam(const char *name, const char *value) {
|
||
|
if (COMPONENTOBJECT_PARENT::setXmlParam(name, value)) return 1;
|
||
|
else if (STRCASEEQL(name, "param")) {
|
||
|
GUID *g;
|
||
|
g = SkinParser::getComponentGuid(value);
|
||
|
if (g)
|
||
|
setGUID(*g);
|
||
|
} else if (STRCASEEQL(name, "noshowcmdbar")) {
|
||
|
noshowcmdbar = WTOI(value);
|
||
|
} else if (STRCASEEQL(name, "autoopen")) {
|
||
|
autoopen = WTOI(value);
|
||
|
} else if (STRCASEEQL(name, "autoclose")) {
|
||
|
autoclose = WTOI(value);
|
||
|
} else if (STRCASEEQL(name, "disableanimatedrects")) {
|
||
|
noanimrects = WTOI(value);
|
||
|
} else return 0;
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
ComponentObject::~ComponentObject() {
|
||
|
deleting = 1;
|
||
|
ComponentManager::unregisterComponentObject(this, 1);
|
||
|
delete my_region_clone;
|
||
|
}
|
||
|
|
||
|
int ComponentObject::onResize() {
|
||
|
COMPONENTOBJECT_PARENT::onResize();
|
||
|
RECT r = clientRect();
|
||
|
if (compwnd) {
|
||
|
compwnd->resize(&r);
|
||
|
}
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
int ComponentObject::handleRatio() {
|
||
|
return compwnd ? compwnd->handleRatio() : 0;
|
||
|
}
|
||
|
|
||
|
void ComponentObject::setGUID(GUID g) {
|
||
|
myGUID = g;
|
||
|
}
|
||
|
|
||
|
void ComponentObject::setCompGUID(GUID g) {
|
||
|
myCompGuid = g;
|
||
|
}
|
||
|
|
||
|
GUID ComponentObject::getGUID(void) {
|
||
|
if (!MEMCMP(&myCompGuid, &INVALID_GUID, sizeof(GUID)))
|
||
|
return myGUID;
|
||
|
else
|
||
|
return myCompGuid;
|
||
|
}
|
||
|
|
||
|
void ComponentObject::script_resetRegion() {
|
||
|
HWND h = ComponentManager::getComponentHWnd(myGUID);
|
||
|
if (h) SetWindowRgn(h, NULL, TRUE);
|
||
|
delete my_region_clone;
|
||
|
my_region_clone = NULL;
|
||
|
}
|
||
|
|
||
|
void ComponentObject::script_setRegionFromMap(SMap *map, int byte, int inv) {
|
||
|
RECT r={map->getBitmap()->getX(), map->getBitmap()->getY(), map->getBitmap()->getWidth(), map->getBitmap()->getHeight()};
|
||
|
api_region *reg = new api_region(map->getBitmap(), &r, 0, 0, FALSE, 1, (unsigned char)byte, inv);
|
||
|
if (!reg) { script_resetRegion(); return; }
|
||
|
delete my_region_clone;
|
||
|
my_region_clone = new api_region();
|
||
|
my_region_clone->add(reg);
|
||
|
delete reg;
|
||
|
HWND h = ComponentManager::getComponentHWnd(myGUID);
|
||
|
if (h) {
|
||
|
api_region *clone = my_region_clone->clone();
|
||
|
clone->scale(getRenderRatio());
|
||
|
SetWindowRgn(h, clone->makeWindowRegion(), TRUE);
|
||
|
my_region_clone->disposeClone(clone);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void ComponentObject::script_setRegion(SRegion *r) {
|
||
|
api_region *reg = r->getRegion();
|
||
|
if (!reg) { script_resetRegion(); return; }
|
||
|
delete my_region_clone;
|
||
|
my_region_clone = new api_region();
|
||
|
my_region_clone->add(reg);
|
||
|
HWND h = ComponentManager::getComponentHWnd(myGUID);
|
||
|
if (h) {
|
||
|
api_region *clone = my_region_clone->clone();
|
||
|
clone->scale(getRenderRatio());
|
||
|
SetWindowRgn(h, clone->makeWindowRegion(), TRUE);
|
||
|
my_region_clone->disposeClone(clone);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void ComponentObject::onSetVisible(int s) {
|
||
|
COMPONENTOBJECT_PARENT::onSetVisible(s);
|
||
|
if (compwnd) {
|
||
|
compwnd->setVisible(s);
|
||
|
onResize();
|
||
|
} else {
|
||
|
if (s && autoopen && myGUID != INVALID_GUID && myGUID != GENERIC_GUID)
|
||
|
api->setComponentVisible(myGUID, 1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void ComponentObject::deniedComponentCompWnd(CompWnd *c, GUID g) {
|
||
|
if (!deleting) {
|
||
|
Container *_c = getGuiObject()->guiobject_getParentGroup()->getParentContainer();
|
||
|
if (_c) _c->resetGUID();
|
||
|
}
|
||
|
compwnd = c;
|
||
|
compwnd->suppressStatusBar(noshowcmdbar);
|
||
|
|
||
|
CallbackManager::issueCallback(SysCallback::WINDOW, WndCallback::HIDEWINDOW, reinterpret_cast<int>((int *)&g));
|
||
|
|
||
|
onReleaseComponent();
|
||
|
compwnd = NULL;
|
||
|
denyDesktopAlpha = 0;
|
||
|
denyTransparency = 0;
|
||
|
if (!deleting) getGuiObject()->guiobject_getParentLayout()->onGuiObjectSetVisible(getGuiObject(), 0);
|
||
|
}
|
||
|
|
||
|
void ComponentObject::grantedComponentCompWnd(CompWnd *c, GUID g) {
|
||
|
Container *_c = getGuiObject()->guiobject_getParentGroup()->getParentContainer();
|
||
|
if (_c) _c->setGUID(g); // tells the container to change its script_id to id:{guid}
|
||
|
compwnd = c;
|
||
|
compwnd->suppressStatusBar(noshowcmdbar);
|
||
|
|
||
|
onResize();
|
||
|
|
||
|
if (isVisible())
|
||
|
c->setVisible(1);
|
||
|
|
||
|
CallbackManager::issueCallback(SysCallback::WINDOW, WndCallback::SHOWWINDOW, reinterpret_cast<int>((int *)&g));
|
||
|
|
||
|
onGetComponent(g);
|
||
|
}
|
||
|
|
||
|
void ComponentObject::onReleaseComponent() {
|
||
|
HWND h = ComponentManager::getComponentHWnd(myGUID);
|
||
|
SetWindowRgn(h, NULL, FALSE);
|
||
|
}
|
||
|
|
||
|
void ComponentObject::onGetComponent(GUID g) {
|
||
|
HWND h = ComponentManager::getComponentHWnd(myGUID);
|
||
|
if (h) {
|
||
|
if (my_region_clone) {
|
||
|
api_region *clone = my_region_clone->clone();
|
||
|
clone->scale(getRenderRatio());
|
||
|
SetWindowRgn(h, clone->makeWindowRegion(), TRUE);
|
||
|
my_region_clone->disposeClone(clone);
|
||
|
} else
|
||
|
SetWindowRgn(h, NULL, FALSE);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int ComponentObject::wantGUID(GUID *g) {
|
||
|
if (!accept || !getGuiObject()->guiobject_getParentGroup()) return 0;
|
||
|
Container *_c = getGuiObject()->guiobject_getParentGroup()->getParentContainer();
|
||
|
if (_c && _c->isDynamic() && compwnd) return 0;
|
||
|
if (!MEMCMP(&myGUID, &GENERIC_GUID, sizeof(GUID))) return 1;
|
||
|
return !MEMCMP(&myGUID, g, sizeof(GUID));
|
||
|
}
|
||
|
|
||
|
void ComponentObject::onBeforeGetWac(GUID g, CompWnd *c) {
|
||
|
// if (!Std::isXPOrGreater())
|
||
|
if (!c->handleDesktopAlpha())
|
||
|
denyDesktopAlpha = 1;
|
||
|
if (!c->handleTransparency())
|
||
|
denyTransparency = 1;
|
||
|
getGuiObject()->guiobject_getParentLayout()->onGuiObjectSetVisible(getGuiObject(), 1);
|
||
|
WACObject *wo = SOM::getWACObject(g);
|
||
|
script_vcpu_onGetWac(SCRIPT_CALL, getScriptObject(), MAKE_SCRIPT_OBJECT(wo ? wo->getScriptObject() : NULL));
|
||
|
}
|
||
|
|
||
|
void ComponentObject::onBeforeGiveUpWac(GUID g, CompWnd *c) {
|
||
|
WACObject *wo = SOM::getWACObject(g);
|
||
|
script_vcpu_onGiveUpWac(SCRIPT_CALL, getScriptObject(), MAKE_SCRIPT_OBJECT(wo ? wo->getScriptObject() : NULL));
|
||
|
}
|
||
|
|
||
|
int ComponentObject::getAutoClose() {
|
||
|
return autoclose;
|
||
|
}
|
||
|
|
||
|
void ComponentObject::setAcceptWac(int a) {
|
||
|
accept = a;
|
||
|
}
|
||
|
|
||
|
int ComponentObject::handleDesktopAlpha() {
|
||
|
if (denyDesktopAlpha) return 0;
|
||
|
if (!compwnd) return 1;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
int ComponentObject::handleTransparency() {
|
||
|
if (denyTransparency) return 0;
|
||
|
if (!compwnd) return 1;
|
||
|
return compwnd->handleTransparency();
|
||
|
}
|
||
|
|
||
|
int ComponentObject::getPreferences(int what) {
|
||
|
if (compwnd) return compwnd->getPreferences(what);
|
||
|
return COMPONENTOBJECT_PARENT::getPreferences(what);
|
||
|
}
|
||
|
|
||
|
scriptVar ComponentObject::script_vcpu_getGUID(SCRIPT_FUNCTION_PARAMS, ScriptObject *o) {
|
||
|
SCRIPT_FUNCTION_INIT;
|
||
|
|
||
|
OLECHAR oguid[256] = {0}; // NONPORTABLE
|
||
|
ComponentObject *co = static_cast<ComponentObject *>(o->vcpu_getInterface(componentObjectGuid));
|
||
|
if (co) {
|
||
|
static char guid[256];
|
||
|
StringFromGUID2(((ComponentObject *)o)->myGUID, oguid, 256);
|
||
|
wsprintf(guid, "%$", oguid);
|
||
|
return MAKE_SCRIPT_STRING(guid);
|
||
|
}
|
||
|
return MAKE_SCRIPT_STRING("");
|
||
|
}
|
||
|
|
||
|
scriptVar ComponentObject::script_vcpu_getWac(SCRIPT_FUNCTION_PARAMS, ScriptObject *o) {
|
||
|
SCRIPT_FUNCTION_INIT; ;
|
||
|
ComponentObject *co = static_cast<ComponentObject *>(o->vcpu_getInterface(componentObjectGuid));
|
||
|
return MAKE_SCRIPT_OBJECT(co ? SOM::getWACObject(co->getGUID())->getScriptObject() : NULL);
|
||
|
}
|
||
|
|
||
|
scriptVar ComponentObject::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));
|
||
|
ComponentObject *co = static_cast<ComponentObject *>(o->vcpu_getInterface(componentObjectGuid));
|
||
|
SMap *sm = static_cast<SMap *>(GET_SCRIPT_OBJECT_AS(map, mapGuid));
|
||
|
co->script_setRegionFromMap(sm, SOM::makeInt(&byte), SOM::makeBoolean(&inv));
|
||
|
RETURN_SCRIPT_VOID;
|
||
|
}
|
||
|
|
||
|
scriptVar ComponentObject::script_vcpu_setRegion(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar r) {
|
||
|
SCRIPT_FUNCTION_INIT; ;
|
||
|
ComponentObject *co = static_cast<ComponentObject *>(o->vcpu_getInterface(componentObjectGuid));
|
||
|
SRegion *reg = static_cast<SRegion *>(GET_SCRIPT_OBJECT_AS(r, regionGuid));
|
||
|
if (co) co->script_setRegion(reg);
|
||
|
RETURN_SCRIPT_VOID;
|
||
|
}
|
||
|
|
||
|
scriptVar ComponentObject::script_vcpu_onGetWac(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar wac) {
|
||
|
SCRIPT_FUNCTION_INIT;
|
||
|
PROCESS_HOOKS1(o, compoController, wac);
|
||
|
SCRIPT_FUNCTION_CHECKABORTEVENT;
|
||
|
SCRIPT_EXEC_EVENT1(o, wac);
|
||
|
}
|
||
|
|
||
|
scriptVar ComponentObject::script_vcpu_onGiveUpWac(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar wac) {
|
||
|
SCRIPT_FUNCTION_INIT;
|
||
|
PROCESS_HOOKS1(o, compoController, wac);
|
||
|
SCRIPT_FUNCTION_CHECKABORTEVENT;
|
||
|
SCRIPT_EXEC_EVENT1(o, wac);
|
||
|
}
|
||
|
|
||
|
scriptVar ComponentObject::script_vcpu_setAcceptWac(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar on) {
|
||
|
SCRIPT_FUNCTION_INIT;
|
||
|
ASSERT(SOM::isNumeric(&on));
|
||
|
ComponentObject *co = static_cast<ComponentObject *>(o->vcpu_getInterface(componentObjectGuid));
|
||
|
if (co) co->setAcceptWac(GET_SCRIPT_BOOLEAN(on));
|
||
|
RETURN_SCRIPT_VOID;
|
||
|
}
|
||
|
|
||
|
|