#ifndef __TREEITEM_H__ #define __TREEITEM_H__ #include "boost/smart_ptr.hpp" #include #include #include "debug.h" #include "atlbase.h" // must be before atlapp.h #include "atlapp.h" // must be before atlctrls.h #include "atlctrls.h" #include "treeitem.h" #include "typeinfo.h" #include "cinfomap.h" class TreeItem; typedef boost::shared_ptr TreeItemPtr; typedef std::vector ItemList; class TreeItem { private: bool _bPopulated; CTreeItem _item; ItemList children; Pointer _ptr; Value _value; const FieldInfo& _field; public: TreeItem(CTreeViewCtrlEx *pTree, TreeItem *pParent, const FieldInfo& field, Pointer ptr) : _bPopulated(false), _ptr(ptr), _value(field.readvalue(ptr)), _field(field) { std::string text; TVINSERTSTRUCT tvis = { 0 }; tvis.hParent= pParent ? *pParent : TVI_ROOT; tvis.hInsertAfter= TVI_ROOT; tvis.item.mask= TVIF_TEXT|TVIF_PARAM|TVIF_CHILDREN; tvis.item.lParam= (LPARAM)this; text= _field.type->summary(_ptr, _value); tvis.item.cChildren= _field.type->fields.empty() ? 0 : 1; tvis.item.pszText= const_cast(text.c_str()); // debug("name=%s type=%s fields=e:%d n:%d c=%d '%s'\n", // _field.name.c_str(), _field.type->name.c_str(), // typeinfomap[_field.type]->fields.empty(), typeinfomap[_field.type]->fields.size(), tvis.item.cChildren, // tvis.item.pszText); _item=pTree->InsertItem(&tvis); debug("created item %08lx -> h=%08lx ht=%08lx\n", this, _item.m_hTreeItem, (HTREEITEM)*this); } operator HTREEITEM() { return _item.m_hTreeItem; } void populate() { debug("populating %08lx p%d h=%08lx ht=%08lx\n", this, _bPopulated, _item.m_hTreeItem, (HTREEITEM)*this); if (_bPopulated) return; debug("populating type %s n=%d\n", _field.type->name.c_str(), _field.type->fields.size()); for (FieldInfoMap::iterator i= _field.type->fields.begin() ; i!=_field.type->fields.end() ; ++i) { children.push_back(TreeItemPtr(new TreeItem(_item.m_pTreeView, this, *(*i).second, _ptr+(*i).first))); // TODO: change 'first' into readdword(_ptr+first) } debug("populate done\n"); _bPopulated= true; } }; #endif