diff options
Diffstat (limited to 'Src/Wasabi/bfc/depview.h')
-rw-r--r-- | Src/Wasabi/bfc/depview.h | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/Src/Wasabi/bfc/depview.h b/Src/Wasabi/bfc/depview.h new file mode 100644 index 00000000..d743764c --- /dev/null +++ b/Src/Wasabi/bfc/depview.h @@ -0,0 +1,103 @@ +#ifndef _DEPVIEW_H +#define _DEPVIEW_H + +#include <bfc/depend.h> +#include <map> + +// this handles classes that use the getDependencyPtr() method instead of a +// public cast + +template <class VT> +class NOVTABLE DependentViewerTPtr : private DependentViewerI +{ +protected: + DependentViewerTPtr(VT *first = NULL) + { + _addViewItem(first); + } + + void viewer_addViewItem(VT *item) { _addViewItem(item); } + void viewer_delViewItem(VT *item) { _delViewItem(item); } + using DependentViewerI::viewer_delAllItems; + + VT *viewer_enumViewItem(int which) + { + return lookup(DependentViewerI::viewer_enumViewItem(which)); + } + using DependentViewerI::viewer_getNumItems; + int viewer_haveItem(VT *item) + { + return DependentViewerI::viewer_haveItem(item->getDependencyPtr()); + } + + // item you were looking at is gone: WARNING: pointer no longer valid! + virtual int viewer_onItemDeleted(VT *item) { return 1; } + // item you are looking at issuing an event + virtual int viewer_onEvent(VT *item, int event, intptr_t param2, void *ptr, size_t ptrlen) { return 1; } + +protected: + virtual int viewer_onItemDeleted(ifc_dependent *item) + { + return viewer_onItemDeleted(lookup(item)); + } + virtual int viewer_onEvent(ifc_dependent *item, const GUID *classguid, int event, intptr_t param, void *ptr, size_t ptrlen) + { + if (*classguid != *VT::depend_getClassGuid()) return 0; // filter namespace + return viewer_onEvent(lookup(item), event, param, ptr, ptrlen); + } + +private: + VT *lookup(ifc_dependent *d) + { + if (d == NULL) + return NULL; + + VT *vt = NULL; + //int r = ptrmap.getItem(d, &vt); + auto it = ptrmap.find(d); + if (it != ptrmap.end()) + { + vt = it->second; + } + + //ASSERT(r); + ASSERT(vt->getDependencyPtr() == d); + return vt; + } + void _addViewItem(VT *item) + { + if (item == NULL) + return ; + ifc_dependent *d = item->getDependencyPtr(); + if (d == NULL) + return ; + + ptrmap.insert({ d, item }); + + DependentViewerI::viewer_addViewItem(d); + } + void _delViewItem(VT *item) + { + if (item == NULL) return ; + ifc_dependent *dep = NULL; + + //ptrmap.reverseGetItem(item, &dep); + //int r = ptrmap.reverseDelItem(item); + for (auto &ptr : ptrmap) + { + if (ptr.second == item) + { + dep = ptr.first; + ptrmap.erase(dep); + break; + } + } + + //ASSERT(r); + DependentViewerI::viewer_delViewItem(dep); + } + + std::map<ifc_dependent *, VT *> ptrmap; +}; + +#endif |