123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369 |
- #include <precomp.h>
- #include "wndholder.h"
- #include <api/service/svcs/svc_wndcreate.h>
- #include <api/service/svc_enum.h>
- #include <api/syscb/callbacks/wndcb.h>
- //#pragma CHAT("lone", "benski", "needs to dispatch Layout & Containers!")
- #include <api/wndmgr/container.h>
- #include <api/wndmgr/layout.h>
- #define CBCLASS WindowHolderI
- START_DISPATCH;
- CB(WNDHOLDER_ONINSERTWINDOW, onInsertWindow);
- VCB(WNDHOLDER_ONREMOVEWINDOW, onRemoveWindow);
- CB(WNDHOLDER_WANTGUID, wantGuid);
- CB(WNDHOLDER_WANTGROUP, wantGroup);
- CB(WNDHOLDER_GETROOTWNDPTR, getRootWndPtr);
- CB(WNDHOLDER_GETCURGROUPID, getCurGroupId);
- CB(WNDHOLDER_GETCURGUID, getCurGuid);
- CB(WNDHOLDER_GETCURROOTWND, getCurRootWnd);
- CB(WNDHOLDER_GETCURID, getCurId);
- CB(WNDHOLDER_ISGENERICGUID, acceptsGenericGuid);
- CB(WNDHOLDER_ISGENERICGROUP, acceptsGenericGroup);
- VCB(WNDHOLDER_CANCELDEFERREDREMOVE, cancelDeferredRemove);
- VCB(WNDHOLDER_ONNEEDRELOADGRP, wndholder_onNeedReloadGroup);
- CB(WNDHOLDER_WANTAUTOFOCUS, wndholder_wantAutoFocus);
- CB(WNDHOLDER_ISAUTOAVAILABLE, wndholder_isAutoAvailable);
- END_DISPATCH;
- WindowHolderI::WindowHolderI() {
- wnd = NULL;
- dr = NULL;
- generic_guid = 1;
- generic_group = 1;
- cur_guid = INVALID_GUID;
- cur_groupid = NULL;
- wc_svc = NULL;
- WASABI_API_WNDMGR->wndholder_register(this);
- }
- WindowHolderI::~WindowHolderI() {
- delete dr;
- if (wnd != NULL) {
- if (wc_svc) {
- ifc_window *w = wnd;
- wnd = NULL;
- wc_svc->destroyWindow(w);
- SvcEnum::release(wc_svc);
- wc_svc = NULL;
- } else {
- ifc_window *w = wnd;
- wnd = NULL;
- WASABI_API_SKIN->group_destroy(w);
- }
- }
- accepted_groups.deleteAll();
- accepted_guids.deleteAll();
- WASABI_API_WNDMGR->wndholder_unregister(this);
- }
- ifc_window *WindowHolderI::onInsertWindow(GUID g, const wchar_t *groupid)
- {
- cancelDeferredRemove();
- defered_guid = INVALID_GUID;
- if (wnd != NULL) return NULL;
- cur_groupid = groupid;
- if (g != INVALID_GUID)
- {
- cur_guid = g;
- wchar_t cguid[256] = {0};
- nsGUID::toCharW(g, cguid);
- cur_id = cguid;
- } else
- cur_id = groupid;
- wnd = createWindow(g == INVALID_GUID ? NULL : &g, groupid);
- if (!wnd) {
- cur_guid = INVALID_GUID;
- cur_id = L"";
- cur_groupid = L"";
- }
- if (wnd) {
- onInsert(wnd, cur_id);
- } else {
- if (g != INVALID_GUID) {
- defered_guid = g;
- }
- }
- return wnd;
- }
- void WindowHolderI::onRemoveWindow(int deferred) {
- if (deferred) {
- if (!dr)
- dr = new DeferredRemove(this);
- dr->post();
- return;
- }
- if (wnd != NULL) {
- ifc_window *w = getCurRootWnd();
- onRemove(w, cur_id);
- destroyWindow();
- cur_guid = INVALID_GUID;
- cur_groupid = NULL;
- defered_guid = INVALID_GUID;
- }
- }
- void WindowHolderI::cancelDeferredRemove() {
- delete dr;
- dr = NULL;
- }
- void WindowHolderI::wndholder_onNeedReloadGroup(const wchar_t *id)
- {
- if (cur_groupid.isempty()) return;
- ifc_window *w = getCurRootWnd();
- if (w == NULL) return;
- if (w->isInited() && !WCSICMP(cur_groupid, id))
- {
- onRemove(w, cur_id);
- destroyWindow();
- createWindow(&INVALID_GUID, id);
- onInsert(wnd, cur_id);
- }
- }
- ifc_window *WindowHolderI::createWindow(const GUID *g, const wchar_t *groupid)
- {
- ASSERT(wnd == NULL);
- if (g != NULL && *g != INVALID_GUID) {
- wc_svc = WindowCreateByGuidEnum(*g).getFirst();
- if (wc_svc)
- wnd = wc_svc->createWindowByGuid(*g, getRootWndPtr());
- }
- else if (groupid != NULL)
- {
- wc_svc = NULL;
- wnd = WASABI_API_SKIN->group_create(groupid);
- }
- if (wnd) {
- if (!wnd->isInited()) {
- if (!wnd->getParent()) wnd->setParent(getRootWndPtr());
- wnd->init(getRootWndPtr());
- }
- }
- return wnd;
- }
- void WindowHolderI::destroyWindow() {
- ASSERT(wnd != NULL);
- ifc_window *w = wnd->getDesktopParent();
- if (wc_svc) {
- ifc_window *w = wnd;
- wnd = NULL;
- wc_svc->destroyWindow(w);
- SvcEnum::release(wc_svc);
- wc_svc = NULL;
- } else {
- ifc_window *w = wnd;
- wnd = NULL;
- WASABI_API_SKIN->group_destroy(w);
- }
- if (w != NULL) {
- if (w->getInterface(layoutGuid)) {
- static_cast<Layout *>(w)->updateTransparency();
- }
- }
- }
- void WindowHolderI::addAcceptGuid(GUID g) {
- accepted_guids.addItem(new GUID(g));
- }
- void WindowHolderI::addAcceptGroup(const wchar_t *groupid)
- {
- accepted_groups.addItem(new StringW(groupid));
- }
- void WindowHolderI::setAcceptAllGuids(int tf) {
- generic_guid = tf;
- }
- void WindowHolderI::setAcceptAllGroups(int tf) {
- generic_group = tf;
- }
- int WindowHolderI::wantGuid(GUID g) {
- if (acceptsGenericGuid()) return 1;
- for (int i=0;i<accepted_guids.getNumItems();i++) {
- if (*accepted_guids.enumItem(i) == g) return 1;
- }
- return 0;
- }
- int WindowHolderI::wantGroup(const wchar_t *groupid)
- {
- if (acceptsGenericGroup()) return 1;
- for (int i=0;i<accepted_groups.getNumItems();i++) {
- if (!WCSICMP(accepted_groups.enumItem(i)->getValue(), groupid))
- return 1;
- }
- return 0;
- }
- GUID *WindowHolderI::getFirstAcceptedGuid() {
- if (accepted_guids.getNumItems() == 0) return NULL;
- return accepted_guids.enumItem(0);
- }
- const wchar_t *WindowHolderI::getFirstAcceptedGroup()
- {
- if (accepted_guids.getNumItems() == 0)
- return NULL;
- return
- accepted_groups.enumItem(0)->getValue();
- }
- int WindowHolderI::wndholder_wantAutoFocus() {
- return 1;
- }
- WindowHolderWnd::WindowHolderWnd() {
- autoavail = 1;
- autoopen = 1;
- autoclose = 0;
- nocmdbar = 0;
- noanim = 0;
- has_wnd = 0;
- autofocus = 1;
- WASABI_API_SYSCB->syscb_registerCallback(this);
- }
- WindowHolderWnd::~WindowHolderWnd() {
- if (has_wnd) {
- notifyOnRemove();
- }
- WASABI_API_SYSCB->syscb_deregisterCallback(this);
- }
- int WindowHolderWnd::onResize() {
- WINDOWHOLDER_PARENT::onResize();
- if (getCurRootWnd()) {
- RECT r;
- getClientRect(&r);
- if (!getCurRootWnd()->handleRatio())
- multRatio(&r);
- getCurRootWnd()->resize(r.left, r.top, r.right-r.left, r.bottom-r.top);
- }
- return 1;
- }
- int WindowHolderWnd::handleRatio() {
- return 1;
- }
- int WindowHolderWnd::handleDesktopAlpha() {
- if (getCurRootWnd()) return getCurRootWnd()->handleDesktopAlpha();
- return 1;
- }
- int WindowHolderWnd::handleTransparency() {
- if (getCurRootWnd()) return getCurRootWnd()->handleTransparency();
- return 1;
- }
- int WindowHolderWnd::onInit() {
- WINDOWHOLDER_PARENT::onInit();
- if (isVisible() && autoopen && getFirstAcceptedGuid()) {
- onInsertWindow(*getFirstAcceptedGuid(), NULL);
- } else if (isVisible() && autoopen && getFirstAcceptedGroup()) {
- onInsertWindow(INVALID_GUID, getFirstAcceptedGroup());
- }
- return 1;
- }
- #define DC_NOTIFYONREMOVE 0x205
- void WindowHolderWnd::onRemove(ifc_window *w, const wchar_t *id)
- {
- ifc_window *dw = getDesktopParent();
- if (dw) dw->removeMinMaxEnforcer(this);
- postDeferredCallback(DC_NOTIFYONREMOVE);
- }
- int WindowHolderWnd::onDeferredCallback(intptr_t p1, intptr_t p2) {
- if (p1 == DC_NOTIFYONREMOVE) {
- notifyOnRemove();
- } else return WINDOWHOLDER_PARENT::onDeferredCallback(p1, p2);
- return 1;
- }
- void WindowHolderWnd::onInsert(ifc_window *w, const wchar_t *id)
- {
- if (isPostOnInit())
- onResize();
- ifc_window *dw = getDesktopParent();
- if (dw) dw->addMinMaxEnforcer(this);
- notifyOnInsert();
- if (wndholder_wantAutoFocus()) w->setFocus();
- }
- int WindowHolderWnd::getPreferences(int what) {
- if (getCurRootWnd()) return getCurRootWnd()->getPreferences(what);
- return WINDOWHOLDER_PARENT::getPreferences(what);
- }
- void WindowHolderWnd::notifyOnRemove() {
- has_wnd = 0;
- Layout *l = getGuiObject()->guiobject_getParentLayout();
- if (l != NULL) {
- Container *c = l->getParentContainer();
- if (c != NULL) {
- c->notifyRemoveContent(this);
- }
- }
- }
- void WindowHolderWnd::notifyOnInsert() {
- has_wnd = 1;
- Layout *l = getGuiObject()->guiobject_getParentLayout();
- if (l != NULL) {
- Container *c = l->getParentContainer();
- if (c != NULL)
- {
- c->notifyAddContent(this, getCurGroupId(), getCurGuid());
- }
- }
- }
- int WindowHolderWnd::onGroupChange(const wchar_t *grpid)
- {
- WINDOWHOLDER_PARENT::onGroupChange(grpid);
- wndholder_onNeedReloadGroup(grpid);
- return 1;
- }
- void WindowHolderWnd::onSetVisible(int show) {
- if (show && getCurRootWnd() == NULL) {
- if (autoopen && getFirstAcceptedGuid()) {
- onInsertWindow(*getFirstAcceptedGuid(), NULL);
- } else if (autoopen && getFirstAcceptedGroup()) {
- onInsertWindow(INVALID_GUID, getFirstAcceptedGroup());
- }
- } else if (!show && getCurRootWnd() != NULL) {
- if (autoclose && WASABI_API_SKIN->skin_getVersion() >= 1.0)
- onRemoveWindow(0);
- }
- if (getDeferedGuid() != INVALID_GUID) {
- if (show) {
- #ifdef ON_CREATE_EXTERNAL_WINDOW_GUID
- int y;
- ON_CREATE_EXTERNAL_WINDOW_GUID(getDeferedGuid(), y);
- #endif
- }
- }
- WINDOWHOLDER_PARENT::onSetVisible(show);
- }
- int WindowHolderWnd::wndholder_wantAutoFocus() {
- return autofocus;
- }
|