123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361 |
- #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;
- }
|