diff options
Diffstat (limited to 'Src/Wasabi/api/wnd/wndclass/wndholder.h')
-rw-r--r-- | Src/Wasabi/api/wnd/wndclass/wndholder.h | 285 |
1 files changed, 285 insertions, 0 deletions
diff --git a/Src/Wasabi/api/wnd/wndclass/wndholder.h b/Src/Wasabi/api/wnd/wndclass/wndholder.h new file mode 100644 index 00000000..580b8ba2 --- /dev/null +++ b/Src/Wasabi/api/wnd/wndclass/wndholder.h @@ -0,0 +1,285 @@ +#ifndef __WINDOWHOLDER_H +#define __WINDOWHOLDER_H + +#include <api/wnd/wndclass/guiobjwnd.h> +#include <bfc/ptrlist.h> +#include <api/syscb/callbacks/wndcb.h> +#include <api/timer/timerclient.h> + +class svc_windowCreate; + +#define WINDOWHOLDER_PARENT GuiObjectWnd + + +/** + Class + + @short + @author Nullsoft + @ver 1.0 + @see +*/ +class WindowHolder : public Dispatchable +{ + public: + ifc_window *onInsertWindow(GUID g, const wchar_t *groupid); + void onRemoveWindow(int deferred=0); + int wantGuid(GUID g); + int wantGroup(const wchar_t *groupid); + GUID getCurGuid(); + const wchar_t *getCurGroupId(); + ifc_window *getCurRootWnd(); + const wchar_t *getCurId(); + ifc_window *getRootWndPtr(); + int acceptsGenericGuid(); + int acceptsGenericGroup(); + int wndholder_getPreferences(int what); + void wndholder_onNeedReloadGroup(const wchar_t *id); + void cancelDeferredRemove(); + int wndholder_wantAutoFocus(); + int wndholder_isAutoAvailable(); + + enum { + WNDHOLDER_ONINSERTWINDOW=50, + WNDHOLDER_ONREMOVEWINDOW=100, + WNDHOLDER_WANTGUID=150, + WNDHOLDER_WANTGROUP=200, + WNDHOLDER_GETROOTWNDPTR=250, + WNDHOLDER_GETCURGUID=300, + WNDHOLDER_GETCURGROUPID=350, + WNDHOLDER_GETCURROOTWND=400, + WNDHOLDER_GETCURID=450, + WNDHOLDER_ISGENERICGUID=500, + WNDHOLDER_ISGENERICGROUP=550, + WNDHOLDER_GETPREFERENCES=600, + WNDHOLDER_ONNEEDRELOADGRP=650, + WNDHOLDER_CANCELDEFERREDREMOVE=660, + WNDHOLDER_WANTAUTOFOCUS=670, + WNDHOLDER_ISAUTOAVAILABLE=680, + }; +}; + +inline ifc_window *WindowHolder::onInsertWindow(GUID g, const wchar_t *groupid) { + return _call(WNDHOLDER_ONINSERTWINDOW, (ifc_window *)NULL, g, groupid); +} + +inline void WindowHolder::onRemoveWindow(int def) { + _voidcall(WNDHOLDER_ONREMOVEWINDOW, def); +} + +inline int WindowHolder::wantGuid(GUID g) { + return _call(WNDHOLDER_WANTGUID, 0, g); +} + +inline int WindowHolder::wantGroup(const wchar_t *groupid) { + return _call(WNDHOLDER_WANTGROUP, 0, groupid); +} + +inline ifc_window *WindowHolder::getRootWndPtr() { + return _call(WNDHOLDER_GETROOTWNDPTR, (ifc_window *)NULL); +} + +inline GUID WindowHolder::getCurGuid() { + return _call(WNDHOLDER_GETCURGUID, INVALID_GUID); +} + +inline const wchar_t *WindowHolder::getCurGroupId() { + return _call(WNDHOLDER_GETCURGROUPID, (const wchar_t *)NULL); +} + +inline ifc_window *WindowHolder::getCurRootWnd() { + return _call(WNDHOLDER_GETCURROOTWND, (ifc_window *)NULL); +} + +inline const wchar_t *WindowHolder::getCurId() { + return _call(WNDHOLDER_GETCURID, (const wchar_t *)NULL); +} + +inline int WindowHolder::acceptsGenericGuid() { + return _call(WNDHOLDER_ISGENERICGUID, 0); +} + +inline int WindowHolder::acceptsGenericGroup() { + return _call(WNDHOLDER_ISGENERICGROUP, 0); +} + +inline int WindowHolder::wndholder_getPreferences(int what) { + return _call(WNDHOLDER_GETPREFERENCES, 0, what); +} + +inline void WindowHolder::wndholder_onNeedReloadGroup(const wchar_t *id) { + _voidcall(WNDHOLDER_ONNEEDRELOADGRP, id); +} + +inline void WindowHolder::cancelDeferredRemove() { + _voidcall(WNDHOLDER_CANCELDEFERREDREMOVE); +} + +inline int WindowHolder::wndholder_wantAutoFocus() { + return _call(WNDHOLDER_WANTAUTOFOCUS, 1); +} + +inline int WindowHolder::wndholder_isAutoAvailable() { + return _call(WNDHOLDER_ISAUTOAVAILABLE, 1); +} + +class DeferredRemove; + +/** + Class + + @short + @author Nullsoft + @ver 1.0 + @see +*/ +class WindowHolderI : public WindowHolder { + public: + + WindowHolderI(); + virtual ~WindowHolderI(); + + virtual ifc_window *onInsertWindow(GUID g, const wchar_t *groupid); + + + virtual void onRemoveWindow(int deferred); + + + void addAcceptGuid(GUID g); + void addAcceptGroup(const wchar_t *groupid); + void setAcceptAllGuids(int tf); + + + void setAcceptAllGroups(int tf); + + virtual int acceptsGenericGroup() { return generic_group; } + + virtual int acceptsGenericGuid() { return generic_guid; } + + virtual int wantGuid(GUID g); + virtual int wantGroup(const wchar_t *groupid); + + virtual void onInsert(ifc_window *w, const wchar_t *id) {}; + + virtual void onRemove(ifc_window *w, const wchar_t *id) {}; + + virtual ifc_window *getRootWndPtr()=0; + virtual GUID getCurGuid() { return cur_guid; } + virtual const wchar_t *getCurGroupId() { return cur_groupid; } + + virtual ifc_window *getCurRootWnd() { return wnd; } + + virtual GUID *getFirstAcceptedGuid(); + virtual const wchar_t *getFirstAcceptedGroup(); + virtual const wchar_t *getCurId() { return cur_id; } + + virtual void cancelDeferredRemove(); + virtual int wndholder_isAutoAvailable() { return 1; } + + GUID getDeferedGuid() { return defered_guid; } + + virtual int wndholder_getPreferences(int what)=0; + + virtual void wndholder_onNeedReloadGroup(const wchar_t *id); + + private: + + + ifc_window *createWindow(const GUID *g, const wchar_t *groupid); + virtual int wndholder_wantAutoFocus(); + + + void destroyWindow(); + + ifc_window *wnd; + GUID cur_guid; + StringW cur_groupid; + StringW cur_id; + PtrList<GUID> accepted_guids; + PtrList<StringW> accepted_groups; + int generic_guid; + int generic_group; + + svc_windowCreate *wc_svc; + GUID defered_guid; + + DeferredRemove *dr; + + protected: + + RECVS_DISPATCH; +}; + + +/** + Class + + @short + @author Nullsoft + @ver 1.0 + @see +*/ +class WindowHolderWnd : public WINDOWHOLDER_PARENT, public WindowHolderI +{ + + public: + + WindowHolderWnd(); + virtual ~WindowHolderWnd(); + virtual int onInit(); + + virtual ifc_window *getRootWndPtr() { return this; } + virtual void onInsert(ifc_window *w, const wchar_t *id); + virtual void onRemove(ifc_window *w, const wchar_t *id); + virtual int onResize(); + virtual int handleRatio(); + virtual int handleDesktopAlpha(); + virtual int handleTransparency(); + virtual int wndholder_getPreferences(int what) { return getPreferences(what); } + virtual int getPreferences(int what); + void setAutoOpen(int tf) { autoopen = tf; } + void setAutoClose(int tf) { autoclose = tf; } + void setNoCmdBar(int tf) { nocmdbar = tf; if (isInited()) invalidate(); } + void setNoAnim(int tf) { noanim = tf; } + virtual int onGroupChange(const wchar_t *grpid); + virtual int wndholder_wantAutoFocus(); + void setAutoFocus(int autof) { autofocus = autof; } + void setAutoAvailable(int autoa) { autoavail = autoa; } + virtual int wndholder_isAutoAvailable() { return autoavail; } + + private: + void notifyOnRemove(); // no virtual please + void notifyOnInsert(); // no virtual please + virtual void onSetVisible(int show); + virtual int onDeferredCallback(intptr_t p1, intptr_t p2); + + int autoopen; + int autoclose; + int nocmdbar; + int noanim; + int has_wnd; + int autofocus; + int autoavail; +}; + +class DeferredRemove : public TimerClientDI +{ + public: + DeferredRemove(WindowHolderI *parent) : whi(parent) {} + virtual ~DeferredRemove() {} + + void post() { + timerclient_postDeferredCallback(1, 0); + } + + virtual int timerclient_onDeferredCallback(intptr_t p1, intptr_t p2) { + if (p1 == 1 && whi != NULL) whi->onRemoveWindow(0); + else return TimerClientDI::timerclient_onDeferredCallback(p1, p2); + return 0; + } + + private: + WindowHolderI *whi; +}; + +#endif |