#include #include "wasabicfg.h" #include #include #include #include #include #include #include #include #include #include #include #include #include // TODO: cut, but we need XuiWindowHolder::parseGUID for now #include #ifdef WIN32 #include "resource.h" #include "../Agave/Language/api_language.h" #endif BEGIN_STRINGDICTIONARY(_containerparams) SDI(L"name", CONTAINERPARAM_NAME); SDI(L"id", CONTAINERPARAM_ID); SDI(L"dynamic", CONTAINERPARAM_DYNAMIC); SDI(L"default_x", CONTAINERPARAM_DEFAULTX); SDI(L"default_y", CONTAINERPARAM_DEFAULTY); SDI(L"default_visible", CONTAINERPARAM_DEFAULTVISIBLE); SDI(L"canclose", CONTAINERPARAM_CANCLOSE); SDI(L"nomenu", CONTAINERPARAM_NOMENU); SDI(L"nofocusapponclose", CONTAINERPARAM_NOFOCUSAPPONCLOSE); SDI(L"primarycomponent", CONTAINERPARAM_CONTENT); END_STRINGDICTIONARY(_containerparams, containerparams); Container::Container(int script_id) { getScriptObject()->vcpu_setInterface(containerGuid, (void *)static_cast(this)); getScriptObject()->vcpu_setClassName(L"Container"); getScriptObject()->vcpu_setController(containerController); scriptid = script_id; currentLayout = -1; default_visible = TRUE; loaded_default_visible = TRUE; dynamic = 0; MEMCPY(&myGUID, &INVALID_GUID, sizeof(GUID)); lastLayout = -1; refocusapponclose = 1; canclose = 1; inited = 0; deleting = 0; transcient = 0; switching_layout = 0; nomenu = 0; prevent_save_visibility = 0; contentGuid = INVALID_GUID; hasContentGuid=false; } void Container::setName(const wchar_t *name) { #ifdef ON_TWEAK_CONTAINER_NAMEW ON_TWEAK_CONTAINER_NAMEW(name); #endif containerName = name ? name : CONTAINER_UNDEFINED_NAME; foreach(layouts) Layout *l = layouts.getfor(); if (l->getRootWndName() == NULL) { l->setOSWndName(name); } endfor; updateDefaultVisible(); dependent_sendEvent(Container::depend_getClassGuid(), Event_NAMECHANGE, 0, this); } void Container::resetLayouts() { updateDefaultVisible(); foreach(layouts) layouts.getfor()->loadSavedState(); endfor; } void Container::setId(const wchar_t *id) { containerId = id ? id : L"undefined"; ismain = !WCSICMP(id, L"main"); } int Container::setXmlParam(const wchar_t *paramname, const wchar_t *strvalue) { switch (containerparams.getId(paramname)) { case CONTAINERPARAM_NAME: setName(strvalue); return 1; case CONTAINERPARAM_ID: setId(strvalue); return 1; case CONTAINERPARAM_DYNAMIC: setDynamic(WTOI(strvalue)); return 1; case CONTAINERPARAM_DEFAULTX: default_x = WTOI(strvalue); return 1; case CONTAINERPARAM_DEFAULTY: default_y = WTOI(strvalue); return 1; case CONTAINERPARAM_DEFAULTVISIBLE: default_visible = WTOI(strvalue); updateDefaultVisible(); return 1; case CONTAINERPARAM_CANCLOSE: canclose = WTOI(strvalue); return 1; case CONTAINERPARAM_NOMENU: nomenu = WTOI(strvalue); return 1; case CONTAINERPARAM_NOFOCUSAPPONCLOSE: refocusapponclose = !WTOI(strvalue); break; case CONTAINERPARAM_CONTENT: { // TODO: move this out of XuiWindowHolder GUID *g = XuiWindowHolder::parseGUID(strvalue); contentGuid = *g; hasContentGuid=true; break; } } return 0; } Container::~Container() { containerCallback(CONT_CB_HIDDEN); layouts.deleteAll(); contents.deleteAll(); SkinParser::containers.removeItem(this); } void Container::getWindowRect(RECT *r) { Layout *l = getCurrentLayout(); if (l) l->getWindowRect(r); } void Container::addLayout(Layout *layout) { layouts.addItem(layout); } const wchar_t *Container::getName() { return containerName; } const wchar_t *Container::getId() { return containerId; } int Container::getDefaultPositionX(void) { return default_x; } int Container::getDefaultPositionY(void) { return default_y; } void Container::onInit(int noshow) { if (inited) return ; inited++; loadFromDefaults(noshow); } void Container::loadFromDefaults(int noshow) { #ifdef WASABI_COMPILE_CONFIG if (last_layout.isempty()) { StringPrintfW tmp(L"container_%s|active", getName()); wchar_t c[512] = {0}; WASABI_API_CONFIG->getStringPrivate(tmp, c, 511, L""); c[510] = 0; last_layout = c; } #endif if (loaded_default_visible) { showDefaultLayout(noshow); } } void Container::setDefaultLayout(const wchar_t *name) { last_layout = name; } void Container::showDefaultLayout(int noshow) { Layout *l = getLayout(last_layout); if (!l) l = layouts.enumItem(0); if (l) { currentLayout = layouts.searchItem(l); if (!noshow) l->setVisible(1); containerCallback(CONT_CB_VISIBLE); // since we set currentLayout prior to showing the layout, the callback will not be processed in onChildSetLayoutVisible } } void Container::setVisible(int sh) { if (!sh && !canclose) return ; int is = isVisible(); if (!!sh == !!is) return ; Layout *l = getCurrentLayout(); if (!l && lastLayout != -1) l = layouts[lastLayout]; if (sh) { if (!l) showDefaultLayout(); else { l->setVisible(1); } } else { if (l) l->setVisible(0); } } int Container::isVisible() { if (switching_layout) return 1; Layout *l = getCurrentLayout(); if (!l) return 0; return l->isVisible(); } void Container::onChildSetLayoutVisible(Layout *l, int v) { for (int i = 0;i < layouts.getNumItems();i++) { if (layouts[i] == l) { if (v) { if (currentLayout != i) { Layout *l = NULL; if (currentLayout >= 0) l = layouts[currentLayout]; if (l) l->setVisible(0); containerCallback(CONT_CB_VISIBLE); currentLayout = i; l = layouts[currentLayout]; #ifdef WASABI_COMPILE_CONFIG if (!isTranscient() && !prevent_save_visibility) WASABI_API_CONFIG->setStringPrivate(StringPrintfW(L"container_%s|active", getName()), l->getGuiObject()->guiobject_getId()); #endif #ifdef WA3COMPATIBILITY l->setForwardMsgWnd(WASABI_API_WND->main_getRootWnd()->gethWnd()); #endif if (l->wantActivation()) { l->bringToFront(); l->setFocus(); } l->invalidate(); } #ifdef WASABI_COMPILE_CONFIG if (!isTranscient() && !isDynamic() && !prevent_save_visibility) WASABI_API_CONFIG->setIntPrivate(StringPrintfW(L"activated/%s", getName()), v); WASABI_API_CONFIG->setIntPrivate(StringPrintfW(L"everloaded/%s", getName()), 1); #endif } else { if (i == currentLayout) { if (!isDeleting() && !isTranscient() && !isDynamic()) { #ifdef WASABI_COMPILE_CONFIG WASABI_API_CONFIG->setIntPrivate(StringPrintfW(L"activated/%s", getName()), v); #endif lastLayout = currentLayout; currentLayout = -1; } containerCallback(CONT_CB_HIDDEN); } } return ; } } } void Container::containerCallback(int msg) { switch (msg) { case CONT_CB_VISIBLE: { foreach(contents) ContentEntry *e = contents.getfor(); WndInfo i; i.groupid = e->groupid; i.guid = e->guid; i.c = this; WASABI_API_SYSCB->syscb_issueCallback(SysCallback::WINDOW, WndCallback::SHOWWINDOW, reinterpret_cast(&i)); endfor WndInfo i; i.groupid = getId(); i.guid = INVALID_GUID; i.c = this; WASABI_API_SYSCB->syscb_issueCallback(SysCallback::WINDOW, WndCallback::SHOWWINDOW, reinterpret_cast(&i)); } break; case CONT_CB_HIDDEN: { foreach(contents) ContentEntry *e = contents.getfor(); WndInfo i; i.groupid = e->groupid; i.guid = e->guid; i.c = this; WASABI_API_SYSCB->syscb_issueCallback(SysCallback::WINDOW, WndCallback::HIDEWINDOW, reinterpret_cast(&i)); endfor WndInfo i; i.groupid = getId(); i.guid = INVALID_GUID; i.c = this; WASABI_API_SYSCB->syscb_issueCallback(SysCallback::WINDOW, WndCallback::HIDEWINDOW, reinterpret_cast(&i)); } break; } } void Container::close() { int norefocs = !wantRefocusApp(); if (norefocs) WASABI_API_WND->appdeactivation_push_disallow(NULL); if (!canclose) return ; if (isDynamic()) { setVisible(0); skinEmbedder->destroyContainer(this); // deferred } else setVisible(0); if (norefocs) WASABI_API_WND->appdeactivation_pop_disallow(NULL); } void Container::toggle() { if (isVisible()) close(); else setVisible(1); // close has special function hide/destroy depending on dynamic status } void Container::switchToLayout(const wchar_t *name, int moveit) { int l = -1; getLayout(name, &l); if (l == -1) { // Layout not found, reverting to first in the list if (layouts.getNumItems() > 0) l = 0; else return ; // none found, abort } switching_layout = 1; if (l != currentLayout) { int old = currentLayout; RECT r = {0}; Layout *oldlayout = old >= 0 ? layouts[old] : NULL; Layout *newlayout = layouts[l]; onBeforeSwitchToLayout(oldlayout, newlayout); if (oldlayout) { oldlayout->getWindowRect(&r); oldlayout->endCapture(); } int unlinked = layouts[l]->isUnlinked(); unlinked |= oldlayout ? oldlayout->isUnlinked() : 0; if (moveit && !unlinked && oldlayout) layouts[l]->move(r.left, r.top); #ifdef WASABI_COMPILE_CONFIG // {9149C445-3C30-4e04-8433-5A518ED0FDDE} const GUID uioptions_guid = { 0x9149c445, 0x3c30, 0x4e04, { 0x84, 0x33, 0x5a, 0x51, 0x8e, 0xd0, 0xfd, 0xde } }; if (_intVal(WASABI_API_CONFIG->config_getCfgItemByGuid(uioptions_guid), L"Link layouts scale")) { #else if (WASABI_WNDMGR_LINKLAYOUTSCALES) { #endif if (oldlayout) { double _r = oldlayout->getRenderRatio(); newlayout->setRenderRatio(_r); } } #ifdef WASABI_COMPILE_CONFIG if (_intVal(WASABI_API_CONFIG->config_getCfgItemByGuid(uioptions_guid), L"Link layouts alpha")) { #else if (WASABI_WNDMGR_LINKLAYOUTSALPHA) { #endif if (oldlayout) { int a = layouts[old]->getAlpha(); newlayout->setAlpha(a); int autoopacify = layouts[old]->getAutoOpacify(); newlayout->setAutoOpacify(autoopacify); } } WindowTracker::layoutChanged(oldlayout, newlayout); #ifdef ON_LAYOUT_CHANGED ON_LAYOUT_CHANGED; #endif layouts[l]->setVisible(1); foreach(SkinParser::containers) SkinParser::containers.getfor()->savePositions(); endfor onSwitchToLayout(newlayout); } switching_layout = 0; } void Container::savePositions() { foreach (layouts) layouts.getfor()->savePosition(); endfor } Layout *Container::getLayout(const wchar_t *name, int *pos) { for ( int i = 0; i < getNumLayouts(); i++ ) { if ( WCSCASEEQLSAFE( enumLayout( i )->getGuiObject()->guiobject_getId(), name ) ) { if (pos) { *pos = i; } return enumLayout( i ); } } return NULL; } Layout *Container::getCurrentLayout() { if (currentLayout < 0) return NULL; return layouts.enumItem(currentLayout); } void Container::otherContainerToggled(const wchar_t *id, int visible) { for (int i = 0;i < layouts.getNumItems();i++) layouts[i]->containerToggled(id, visible); } void Container::componentToggled(GUID *g, int visible) { for (int i = 0;i < layouts.getNumItems();i++) layouts[i]->componentToggled(g, visible); } void Container::sendNotifyToAllLayouts(int notifymsg, int param1, int param2) { for (int i = 0;i < layouts.getNumItems();i++) layouts[i]->sendNotifyToAllChildren(notifymsg, param1, param2); } int Container::isMainContainer() { return ismain; } void Container::sysMenu() { POINT p; Wasabi::Std::getMousePos(&p); layouts.enumItem(currentLayout)->onRightButtonDown(p.x, p.y); } void Container::setDynamic(int i) { dynamic = i; if (!containerId.isempty()) setId(containerId); } int Container::isDynamic() { return dynamic; } void Container::onSwitchToLayout(Layout *l) { ScriptObject *ls = l ? l->getGuiObject()->guiobject_getScriptObject() : NULL; script_onSwitchToLayout(SCRIPT_CALL, getScriptObject(), MAKE_SCRIPT_OBJECT(ls)); } void Container::onBeforeSwitchToLayout(Layout *oldl, Layout *newl) { ScriptObject *olds = oldl ? oldl->getGuiObject()->guiobject_getScriptObject() : NULL; ScriptObject *news = newl ? newl->getGuiObject()->guiobject_getScriptObject() : NULL; script_onBeforeSwitchToLayout(SCRIPT_CALL, getScriptObject(), MAKE_SCRIPT_OBJECT(olds), MAKE_SCRIPT_OBJECT(news)); } void Container::onHideLayout(Layout *l) { script_onHideLayout(SCRIPT_CALL, getScriptObject(), MAKE_SCRIPT_OBJECT(l->getGuiObject()->guiobject_getScriptObject())); } void Container::onShowLayout(Layout *l) { script_onShowLayout(SCRIPT_CALL, getScriptObject(), MAKE_SCRIPT_OBJECT(l->getGuiObject()->guiobject_getScriptObject())); } int Container::getNumLayouts() { return layouts.getNumItems(); } Layout *Container::enumLayout(int n) { return layouts.enumItem(n); } const wchar_t *Container::getDescriptor() { static wchar_t d[256]; // if we've tweaked the container names then when saving out we can see and attempt to 'untweak' // so that things like Winamp Modern's ML will be correctly positioned irrespective of language int untweak = 0; wchar_t tweaked[96] = {0}; // Martin> We need to check the containerName against null - dunno why some skins cause this string to be null if(containerName.v() != NULL && !_wcsicmp(containerName.v(), WASABI_API_LNGSTRINGW_BUF(IDS_MEDIA_LIBRARY,tweaked,96))){ untweak = 1; } WCSNPRINTF(d, 256,L"%s/%s", getId(), (!untweak ? containerName.v() : L"Media Library")); return d; } void Container::updateDefaultVisible() { if (!canclose) { loaded_default_visible = 1; return ; } #ifdef WASABI_COMPILE_CONFIG loaded_default_visible = WASABI_API_CONFIG->getIntPrivate(StringPrintfW(L"activated/%s", getName()), default_visible); #else loaded_default_visible = default_visible; #endif } int Container::getScriptId() { return scriptid; } void Container::notifyAddContent(ifc_window *w, const wchar_t *id, GUID g) { contents.addItem(new ContentEntry(id, g, w)); ScriptObject *_w = w ? w->getGuiObject()->guiobject_getScriptObject() : NULL; wchar_t guidstr[256] = {0}; nsGUID::toCharW(g, guidstr); script_onAddContent(SCRIPT_CALL, getScriptObject(), MAKE_SCRIPT_OBJECT(_w), MAKE_SCRIPT_STRING(id), MAKE_SCRIPT_STRING(guidstr)); } void Container::notifyRemoveContent(ifc_window *w) { foreach(contents) ContentEntry *e = contents.getfor(); if (e->wnd == w) { contents.removeItem(e); delete e; return ; } endfor; } int Container::hasContent(GUID g) { foreach(contents) ContentEntry *e = contents.getfor(); if (e->guid == g) { return 1; } endfor; return 0; } GUID Container::getDefaultContent() { if (hasContentGuid) return contentGuid; if (contents.getNumItems() > 0) return contents.enumItem(0)->guid; return INVALID_GUID; } ContainerScriptController _containerController; ContainerScriptController *containerController = &_containerController; // -- Functions table ------------------------------------- function_descriptor_struct ContainerScriptController::exportedFunction[] = { {L"onSwitchToLayout", 1, (void*)Container::script_onSwitchToLayout }, {L"onBeforeSwitchToLayout", 2, (void*)Container::script_onBeforeSwitchToLayout }, {L"onHideLayout", 1, (void*)Container::script_onHideLayout }, {L"onShowLayout", 1, (void*)Container::script_onShowLayout }, {L"getLayout", 1, (void*)Container::script_getLayout }, {L"getNumLayouts", 0, (void*)Container::script_getNumLayouts }, {L"enumLayout", 1, (void*)Container::script_enumLayout }, {L"getCurLayout", 0, (void*)Container::script_getCurrentLayout}, {L"switchToLayout", 1, (void*)Container::script_switchToLayout }, {L"isDynamic", 0, (void*)Container::script_isDynamic }, {L"show", 0, (void*)Container::script_show }, {L"hide", 0, (void*)Container::script_hide }, {L"close", 0, (void*)Container::script_close}, {L"toggle", 0, (void*)Container::script_toggle }, {L"setName", 1, (void*)Container::script_setName }, {L"getName", 0, (void*)Container::script_getName }, {L"getGuid", 0, (void*)Container::script_getGuid }, {L"setXmlParam", 2, (void*)Container::script_setXmlParam}, {L"onAddContent", 3, (void*)Container::script_onAddContent}, }; // -------------------------------------------------------- /*SET_HIERARCHY(Container, SCRIPT_CONTAINER); SET_HIERARCHY2(Container, SCRIPT_CONTAINER, CONTAINER_SCRIPTPARENT);*/ const wchar_t *ContainerScriptController::getClassName() { return L"Container"; } const wchar_t *ContainerScriptController::getAncestorClassName() { return L"Object"; } ScriptObjectController *ContainerScriptController::getAncestorController() { return rootScriptObjectController; } int ContainerScriptController::getInstantiable() { return 1; } ScriptObject *ContainerScriptController::instantiate() { Container *c = new Container; return c->getScriptObject(); } void ContainerScriptController::destroy(ScriptObject *o) { //ASSERTALWAYS("be nice, don't do that"); Container *c = (Container *)o->vcpu_getInterface(containerGuid); delete c; } void *ContainerScriptController::encapsulate(ScriptObject *o) { return NULL; } void ContainerScriptController::deencapsulate(void *o) {} int ContainerScriptController::getNumFunctions() { return sizeof(exportedFunction) / sizeof(function_descriptor_struct); } const function_descriptor_struct *ContainerScriptController::getExportedFunctions() { return exportedFunction; } GUID ContainerScriptController::getClassGuid() { return containerGuid; } //----------------------------------------------------------------------- scriptVar Container::script_onSwitchToLayout(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar l) { SCRIPT_FUNCTION_INIT; PROCESS_HOOKS1(o, containerController, l); SCRIPT_FUNCTION_CHECKABORTEVENT; SCRIPT_EXEC_EVENT1(o, l); } scriptVar Container::script_onBeforeSwitchToLayout(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar oldl, scriptVar newl) { SCRIPT_FUNCTION_INIT; PROCESS_HOOKS2(o, containerController, oldl, newl); SCRIPT_FUNCTION_CHECKABORTEVENT; SCRIPT_EXEC_EVENT2(o, oldl, newl); } scriptVar Container::script_onHideLayout(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar l) { SCRIPT_FUNCTION_INIT; PROCESS_HOOKS1(o, containerController, l); SCRIPT_FUNCTION_CHECKABORTEVENT; SCRIPT_EXEC_EVENT1(o, l); } scriptVar Container::script_onShowLayout(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar l) { SCRIPT_FUNCTION_INIT; PROCESS_HOOKS1(o, containerController, l); SCRIPT_FUNCTION_CHECKABORTEVENT; SCRIPT_EXEC_EVENT1(o, l); } // Get an layout from its ID scriptVar Container::script_getLayout(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar obj) { SCRIPT_FUNCTION_INIT ASSERT(obj.type == SCRIPT_STRING); // compiler discarded Container *c = static_cast(o->vcpu_getInterface(containerGuid)); if (c) { for (int i = 0;i < c->layouts.getNumItems();i++) if (!WCSICMP(obj.data.sdata, c->layouts.enumItem(i)->getGuiObject()->guiobject_getId())) { return MAKE_SCRIPT_OBJECT(c->layouts.enumItem(i)->getGuiObject()->guiobject_getScriptObject()); } } RETURN_SCRIPT_ZERO; } scriptVar Container::script_show(SCRIPT_FUNCTION_PARAMS, ScriptObject *o) { SCRIPT_FUNCTION_INIT Container *c = static_cast(o->vcpu_getInterface(containerGuid)); if (c) c->setVisible(1); RETURN_SCRIPT_VOID; } scriptVar Container::script_hide(SCRIPT_FUNCTION_PARAMS, ScriptObject *o) { SCRIPT_FUNCTION_INIT Container *c = static_cast(o->vcpu_getInterface(containerGuid)); if (c) c->setVisible(0); RETURN_SCRIPT_VOID; } scriptVar Container::script_close(SCRIPT_FUNCTION_PARAMS, ScriptObject *o) { SCRIPT_FUNCTION_INIT Container *c = static_cast(o->vcpu_getInterface(containerGuid)); if (c) c->close(); RETURN_SCRIPT_VOID; } scriptVar Container::script_toggle(SCRIPT_FUNCTION_PARAMS, ScriptObject *o) { SCRIPT_FUNCTION_INIT Container *c = static_cast(o->vcpu_getInterface(containerGuid)); if (c) c->toggle(); RETURN_SCRIPT_VOID; } // Switch to another layout scriptVar Container::script_switchToLayout(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar l) { SCRIPT_FUNCTION_INIT Container *c = static_cast(o->vcpu_getInterface(containerGuid)); if (c) c->switchToLayout(GET_SCRIPT_STRING(l)); RETURN_SCRIPT_VOID; } scriptVar Container::script_getNumLayouts(SCRIPT_FUNCTION_PARAMS, ScriptObject *o) { SCRIPT_FUNCTION_INIT Container *c = static_cast(o->vcpu_getInterface(containerGuid)); if (c) return MAKE_SCRIPT_INT(c->getNumLayouts()); RETURN_SCRIPT_ZERO; } scriptVar Container::script_enumLayout(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar n) { SCRIPT_FUNCTION_INIT ASSERT(SOM::isNumeric(&n)); // compiler discarded Container *c = static_cast(o->vcpu_getInterface(containerGuid)); Layout *l = NULL; if (c) l = c->enumLayout(SOM::makeInt(&n)); return MAKE_SCRIPT_OBJECT(l ? l->getScriptObject() : NULL); } scriptVar Container::script_getCurrentLayout(SCRIPT_FUNCTION_PARAMS, ScriptObject *o) { SCRIPT_FUNCTION_INIT Container *c = static_cast(o->vcpu_getInterface(containerGuid)); Layout *l = c->getCurrentLayout(); return MAKE_SCRIPT_OBJECT(l ? l->getScriptObject() : NULL); } // Switch to another layout scriptVar Container::script_vcpu_getId(SCRIPT_FUNCTION_PARAMS, ScriptObject *o) { SCRIPT_FUNCTION_INIT Container *c = static_cast(o->vcpu_getInterface(containerGuid)); if (c) return MAKE_SCRIPT_STRING(c->getId()); return MAKE_SCRIPT_STRING(L""); } scriptVar Container::script_isDynamic(SCRIPT_FUNCTION_PARAMS, ScriptObject *o) { SCRIPT_FUNCTION_INIT Container *c = static_cast(o->vcpu_getInterface(containerGuid)); if (c) return MAKE_SCRIPT_INT(c->isDynamic()); RETURN_SCRIPT_ZERO; } scriptVar Container::script_setName(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar name) { SCRIPT_FUNCTION_INIT Container *c = static_cast(o->vcpu_getInterface(containerGuid)); if (c) c->setName(GET_SCRIPT_STRING(name)); RETURN_SCRIPT_VOID; } scriptVar Container::script_getName(SCRIPT_FUNCTION_PARAMS, ScriptObject *o) { SCRIPT_FUNCTION_INIT Container *c = static_cast(o->vcpu_getInterface(containerGuid)); if (c) return MAKE_SCRIPT_STRING(c->getName()); return MAKE_SCRIPT_STRING(L""); } scriptVar Container::script_getGuid(SCRIPT_FUNCTION_PARAMS, ScriptObject *o) { SCRIPT_FUNCTION_INIT Container *c = static_cast(o->vcpu_getInterface(containerGuid)); if (c) { static wchar_t guidstr[256]; nsGUID::toCharW(c->getGUID(), guidstr); return MAKE_SCRIPT_STRING(guidstr); } return MAKE_SCRIPT_STRING(L""); } scriptVar Container::script_setXmlParam(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar p, scriptVar v) { SCRIPT_FUNCTION_INIT Container *c = static_cast(o->vcpu_getInterface(containerGuid)); if (c) c->setXmlParam(GET_SCRIPT_STRING(p), GET_SCRIPT_STRING(v)); RETURN_SCRIPT_VOID; } //void Container::notifyAddContent(ifc_window *w, const wchar_t *id, GUID g) scriptVar Container::script_onAddContent(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar window, scriptVar id, scriptVar g) { SCRIPT_FUNCTION_INIT; PROCESS_HOOKS3(o, containerController, window, id, g); SCRIPT_FUNCTION_CHECKABORTEVENT; SCRIPT_EXEC_EVENT3(o, window, id, g); }