From 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d Mon Sep 17 00:00:00 2001 From: Jef Date: Tue, 24 Sep 2024 14:54:57 +0200 Subject: Initial community commit --- Src/Wasabi/api/wnd/wndclass/abstractwndhold.cpp | 287 ++++++++++++++++++++++++ 1 file changed, 287 insertions(+) create mode 100644 Src/Wasabi/api/wnd/wndclass/abstractwndhold.cpp (limited to 'Src/Wasabi/api/wnd/wndclass/abstractwndhold.cpp') diff --git a/Src/Wasabi/api/wnd/wndclass/abstractwndhold.cpp b/Src/Wasabi/api/wnd/wndclass/abstractwndhold.cpp new file mode 100644 index 00000000..95af35a8 --- /dev/null +++ b/Src/Wasabi/api/wnd/wndclass/abstractwndhold.cpp @@ -0,0 +1,287 @@ +#include "precomp.h" +#include + +#include "abstractwndhold.h" +#include +#include +#include +#include +#include +#include +#include + + +#define CB_ABSTRACTLOAD 0x1125 + +AbstractWndHolder::AbstractWndHolder(const wchar_t *grpid, int autoresize) : ServiceWndHolder(NULL, NULL) +{ + scripts_enabled = 1; + groupid = grpid; + group_item = NULL; + guid = INVALID_GUID; + group = NULL; + cbreg = 0; + inselfresize = 0; + autoresizefromcontent = autoresize; + allow_deferred_content = 0; + need_deferred_load = 0; +} + +AbstractWndHolder::AbstractWndHolder(SkinItem *groupitem, int autoresize) : ServiceWndHolder(NULL, NULL) { + group_item = groupitem; + guid = INVALID_GUID; + group = NULL; + cbreg = 0; + inselfresize = 0; + autoresizefromcontent = autoresize; + allow_deferred_content = 0; + need_deferred_load = 0; +} + +AbstractWndHolder::AbstractWndHolder(GUID g, int autoresize) : ServiceWndHolder(NULL, NULL) { + guid = g; + group = NULL; + cbreg = 0; + group_item = NULL; + inselfresize = 0; + autoresizefromcontent = autoresize; + allow_deferred_content = 0; + need_deferred_load = 0; +} + +AbstractWndHolder::~AbstractWndHolder() { + if (group) { +#ifdef WASABI_COMPILE_SKIN + WASABI_API_SKIN->group_destroy(group); +#endif + group = NULL; + } + if (cbreg) WASABI_API_SYSCB->syscb_deregisterCallback(this); +} + +int AbstractWndHolder::onInit() { + ABSTRACTWNDHOLDER_PARENT::onInit(); + createChild(); + return 1; +} + +ifc_window *AbstractWndHolder::rootwndholder_getRootWnd() { + if (group != NULL) return group; + return ABSTRACTWNDHOLDER_PARENT::rootwndholder_getRootWnd(); +} + +void AbstractWndHolder::abstract_setContent(const wchar_t *group_id, int autoresize) +{ + setBothContent(group_id, INVALID_GUID, autoresize); +} + +void AbstractWndHolder::abstract_setContentBySkinItem(SkinItem *item, int autoresize) { + setContentSkinItem(item, autoresize); +} + +void AbstractWndHolder::abstract_setContent(GUID g, int autoresize) { + setBothContent(NULL, g, autoresize); +} + +void AbstractWndHolder::setBothContent(const wchar_t *group_id, GUID g, int autoresize) +{ + group_item = NULL; + if (autoresize != -1) + autoresizefromcontent = autoresize; + if (WCSCASEEQLSAFE(groupid, group_id) || (guid != INVALID_GUID && guid == g)) return; + GUID _g = nsGUID::fromCharW(group_id); + if (g == INVALID_GUID && _g != INVALID_GUID) { + groupid = NULL; + guid = _g; + } else { + groupid = group_id; + guid = g; + } + createChild(); +} + +void AbstractWndHolder::setContentSkinItem(SkinItem *item, int autoresize) +{ + if (autoresize != -1) + autoresizefromcontent = autoresize; + groupid.trunc(0); + guid = INVALID_GUID; + group_item = item; + createChild(); +} + +int AbstractWndHolder::onGroupChange(const wchar_t *grpid) +{ + if (WCSCASEEQLSAFE(groupid, grpid)) + { + createChild(); + notifyParent(ChildNotify::GROUPRELOAD); + notifyParent(ChildNotify::AUTOWHCHANGED); + } + return 1; +} + +void AbstractWndHolder::createChild() { + if (!isInited()) return; + destroyContent(); + if (allow_deferred_content && !isVisible()) + need_deferred_load = 1; + else + doLoadContent(); +} + +void AbstractWndHolder::destroyContent() +{ + if (group != NULL) { +#ifdef WASABI_COMPILE_SKIN + WASABI_API_SKIN->group_destroy(group); +#endif + if (cbreg) { + WASABI_API_SYSCB->syscb_deregisterCallback(this); + cbreg=0; + } + ABSTRACTWNDHOLDER_PARENT::setChild(NULL, NULL); + } + group = NULL; +} + +int AbstractWndHolder::onDeferredCallback(intptr_t p1, intptr_t p2) +{ + if (p1 == CB_ABSTRACTLOAD) { + doLoadContent(); + return 1; + } + return ABSTRACTWNDHOLDER_PARENT::onDeferredCallback(p1, p2); +} + +#include + +void AbstractWndHolder::doLoadContent() { + int didsomething = 0; + need_deferred_load = 0; + if (group_item != NULL) { +#ifdef WASABI_COMPILE_SKIN + group = WASABI_API_SKIN->group_createBySkinItem(group_item, scripts_enabled); +#endif + if (group) { + if (!cbreg) { + WASABI_API_SYSCB->syscb_registerCallback(this); + cbreg=1; + } + group->setParent(this); + group->init(this); + abstract_onNewContent(); + didsomething = 1; + } + } else if (!groupid.isempty()) { +#ifdef WASABI_COMPILE_SKIN + group = WASABI_API_SKIN->group_create(groupid, scripts_enabled); +#endif + if (group) { + if (!cbreg) { + WASABI_API_SYSCB->syscb_registerCallback(this); + cbreg=1; + } + group->setParent(this); + group->init(this); + abstract_onNewContent(); + didsomething = 1; + } + } else if (guid != INVALID_GUID) { + svc_windowCreate *svc = WindowCreateByGuidEnum(guid).getNext(); + ABSTRACTWNDHOLDER_PARENT::setChild(svc->createWindowByGuid(guid, this), svc); + abstract_onNewContent(); + didsomething = 1; + } + if (didsomething && isPostOnInit()) + { + onResize(); + } +} + +void AbstractWndHolder::abstract_onNewContent() +{ + if (isPostOnInit()) { + ifc_window *w = getDesktopParent(); + if (w != NULL) { + if (w->enumMinMaxEnforcer(0)) { + w->signalMinMaxEnforcerChanged(); + } + } + } +} + +GuiObject *AbstractWndHolder::abstract_findObject(const wchar_t *object_id) +{ + ifc_window *w = rootwndholder_getRootWnd(); + if (w == NULL) return NULL; + GuiObject *o = static_cast(w->getInterface(guiObjectGuid)); + return o->guiobject_findObject(object_id); +} + +ScriptObject *AbstractWndHolder::abstract_findScriptObject(const wchar_t *object_id) +{ + ifc_window *w = rootwndholder_getRootWnd(); + if (w == NULL) return NULL; + GuiObject *o = static_cast(w->getInterface(guiObjectGuid)); + GuiObject *fo = o->guiobject_findObject(object_id); + if (fo != NULL) return fo->guiobject_getScriptObject(); + return NULL; +} + + +GuiObject *AbstractWndHolder::abstract_getContent() { + ifc_window *w = rootwndholder_getRootWnd(); + if (w == NULL) return NULL; + return static_cast(w->getInterface(guiObjectGuid)); +} + +ScriptObject *AbstractWndHolder::abstract_getContentScriptObject() { + ifc_window *w = rootwndholder_getRootWnd(); + if (w == NULL) return NULL; + return static_cast(w->getInterface(scriptObjectGuid)); +} + +int AbstractWndHolder::onResize() { + int rt = ABSTRACTWNDHOLDER_PARENT::onResize(); + if (group != NULL && abstract_wantAutoResizeFromContent()) { + if (inselfresize) return rt; + inselfresize=1; + int w = group->getPreferences(SUGGESTED_W); + int h = group->getPreferences(SUGGESTED_H); + resize(NOCHANGE, NOCHANGE, w == AUTOWH ? NOCHANGE : w, h == AUTOWH ? NOCHANGE : h); + inselfresize = 0; + } + return rt; +} + +void AbstractWndHolder::onSetVisible( int show ) +{ + ABSTRACTWNDHOLDER_PARENT::onSetVisible( show ); + if ( allow_deferred_content ) + { + if ( show & need_deferred_load ) + { + doLoadContent(); + } + if ( !show && !need_deferred_load ) + { + destroyContent(); + need_deferred_load = 1; + } + } +} + +void AbstractWndHolder::abstract_setScriptsEnabled(int en) +{ + if (scripts_enabled == en) return; + scripts_enabled = en; + if (group != NULL) { + destroyContent(); + doLoadContent(); + } +} + +int AbstractWndHolder::abstact_getScriptsEnabled() { + return scripts_enabled; +} -- cgit