#ifndef _IMAGELIST_TREEVIEW_HPP_ #define _IMAGELIST_TREEVIEW_HPP_ #ifndef _COMMON_WINDOWS_HPP_ #include #endif #ifndef _COMMON_COMMCTRL_HPP_ #include #endif #ifndef _COMMON_STRING_HPP_ #include #endif #ifndef _COMMON_RECTANGLE_HPP_ #include #endif #ifndef _COMMON_CALLBACK_HPP_ #include #endif #ifndef _IMAGELIST_IMAGELIST_HPP_ #include #endif #ifndef _IMAGELIST_TREEVIEWINSERT_HPP_ #include #endif #ifndef _IMAGELIST_TREEVIEWITEM_HPP_ #include #endif #ifndef _COMMON_HOOKPROC_HPP_ #include #endif class TreeViewMessageHeader; class TreeViewDisplayInfo; class GUIWindow; class HitTestInfo; class TreeView : public WinHookProc { public: enum{ControlID=101}; enum TreeFlags{TreeHasButtons=TVS_HASBUTTONS,TreeHasLines=TVS_HASLINES, TreeLinesAtRoot=TVS_LINESATROOT,TreeEditLabels=TVS_EDITLABELS, TreeDisableDragDrop=TVS_DISABLEDRAGDROP,TreeShowSelAlways=TVS_SHOWSELALWAYS}; enum TreeExpand{Collapse=TVE_COLLAPSE,CollapseReset=TVE_COLLAPSERESET, Expand=TVE_EXPAND,Toggle=TVE_TOGGLE}; enum NodeType{NodeChild=0,NodeSibling=1}; enum ListType{Normal=TVSIL_NORMAL,State=TVSIL_STATE}; TreeView(GUIWindow &parentWindow,DWORD viewFlags=TreeHasLines,const Rect &winRect=Rect(1,1,320,200),int controlID=ControlID); virtual ~TreeView(); HIMAGELIST setImageList(ImageList &someImageList,WORD itemIndex=0); HIMAGELIST createDragImage(HTREEITEM hTreeItem); HTREEITEM addRootNode(DWORD indexImage,const String &textString,DWORD userData); HWND getControlWnd(void)const; HWND getEditControl(void)const; String currentSelection(void)const; String currentParentSelection(void)const; String getRootItemText(void)const; UINT getCount(void)const; int controlID(void)const; HTREEITEM getChild(HTREEITEM hTreeItem)const; HTREEITEM getNextSibling(HTREEITEM hTreeItem)const; HTREEITEM getParent(HTREEITEM hTreeItem)const; HTREEITEM hitTest(HitTestInfo &someHitTestInfo)const; HTREEITEM selectItem(HTREEITEM hTreeItem)const; HTREEITEM selectDropTarget(HTREEITEM hTreeItem)const; HTREEITEM insertItem(TreeViewInsert &someTreeViewInsert); HIMAGELIST getImageList(ListType listType=Normal); const TreeViewInsert &lastInsert(void)const; WORD addNode(NodeType nodeType,TreeViewItem &insertTreeViewItem,const String &parentString,WORD selected=FALSE,BYTE delimeter=0); WORD appendNode(NodeType nodeType,DWORD itemIndex,const String &text,DWORD userData,WORD selected=FALSE); WORD moveTree(int left,int top,int right,int bottom,WORD repaint=TRUE)const; WORD getItemRect(Rect &itemRect,BOOL boundingText=TRUE)const; WORD getItemRect(Rect &itemRect,HTREEITEM hTreeItem,BOOL boundingText=TRUE)const; WORD getItem(TreeViewItem &someTreeViewItem)const; WORD setItem(const TreeViewItem &someTreeViewItem)const; WORD remove(HTREEITEM hTreeItem)const; WORD remove(const String &nodeName)const; WORD setRedraw(WORD redrawFlag)const; WORD setFocus(void)const; WORD remove(void)const; BOOL update(void)const; BOOL invalidate(void)const; WORD isOkay(void)const; protected: HTREEITEM getRoot(void)const; virtual WORD tvnSelChanging(const TreeViewMessageHeader &treeViewMessageHeader); virtual WORD tvnSelChanged(const TreeViewMessageHeader &treeViewMessageHeader); virtual WORD tvnGetDispInfo(TreeViewDisplayInfo &treeViewDisplayInfo); virtual WORD tvnSetDispInfo(TreeViewDisplayInfo &treeViewDisplayInfo); virtual WORD tvnItemExpanding(const TreeViewMessageHeader &treeViewMessageHeader); virtual WORD tvnItemExpanded(const TreeViewMessageHeader &treeViewMessageHeader); virtual WORD tvnBeginDrag(const TreeViewMessageHeader &treeViewMessageHeader); virtual WORD tvnBeginRDrag(const TreeViewMessageHeader &treeViewMessageHeader); virtual WORD tvnDeleteItem(const TreeViewMessageHeader &treeViewMessageHeader); virtual WORD tvnBeginLabelEdit(const TreeViewDisplayInfo &treeViewDisplayInfo); virtual WORD tvnEndLabelEdit(const TreeViewDisplayInfo &treeViewDisplayInfo); virtual WORD tvnKeyDown(const TreeViewMessageHeader &treeViewMessageHeader); private: CallbackData::ReturnType notifyHandler(CallbackData &someCallbackData); CallbackData::ReturnType rightButtonUpHandler(CallbackData &someCallbackData); CallbackData::ReturnType rightButtonDownHandler(CallbackData &someCallbackData); WORD handleGetDisplayInfo(CallbackData &someCallackData); void createTreeView(const Rect &winRect,DWORD viewFlags,int controlID); HTREEITEM selectSetFirstVisible(HTREEITEM hTreeItem); HTREEITEM getDropHilight(void); HTREEITEM getSelection(void)const; HTREEITEM searchItem(const String &searchString,HTREEITEM hDescendItem=(HTREEITEM)0)const; HTREEITEM getFirstVisible(void); HTREEITEM select(HTREEITEM hTreeItem,WPARAM code)const; HTREEITEM getNextItem(HTREEITEM hTreeItem,WPARAM code)const; HTREEITEM getPrevSibling(HTREEITEM hTreeItem); HTREEITEM getNextVisible(HTREEITEM hTreeItem); HTREEITEM getPrevVisible(HTREEITEM hTreeItem); WORD sortChildren(HTREEITEM hTreeItem,WPARAM recurse); WORD expand(HTREEITEM hTreeItem,WPARAM code); WORD getISearchString(String &searchString); WORD searchInsert(NodeType nodeType,TreeViewItem &viewItem,TreeViewInsert &viewInsert,const String &parentString,HTREEITEM hParentItem,HTREEITEM hChildItem,BYTE delimeter=0); WORD ensureVisible(HTREEITEM hTreeItem); WORD endEditLabelNow(WPARAM cancel); WORD setIndent(WORD indent); HWND getEditLabel(HTREEITEM hTreeItem); UINT getVisibleCount(void); UINT getIndent(void); UINT indent(void); void indent(UINT indent); Callback mNotifyHandler; GUIWindow &mParentWindow; HWND mhTreeViewWnd; int mControlID; TreeViewInsert mLastInsert; }; inline UINT TreeView::indent(void) { if(!isOkay())return FALSE; return (UINT)::SendMessage(mhTreeViewWnd,TVM_GETINDENT,0,0L); } inline void TreeView::indent(UINT indent) { if(!isOkay())return; ::SendMessage(mhTreeViewWnd,TVM_SETINDENT,(WPARAM)indent,0L); } inline HTREEITEM TreeView::insertItem(TreeViewInsert &someTreeViewInsert) { HTREEITEM hTreeItem; if(!isOkay())return FALSE; hTreeItem=(HTREEITEM)::SendMessage(mhTreeViewWnd,TVM_INSERTITEM,0,(LPARAM)&((TV_INSERTSTRUCT&)someTreeViewInsert)); if(hTreeItem){mLastInsert=someTreeViewInsert;mLastInsert.insertAfter(hTreeItem);} return hTreeItem; } inline WORD TreeView::remove(HTREEITEM hTreeItem)const { if(!isOkay())return FALSE; return ::SendMessage(mhTreeViewWnd,TVM_DELETEITEM,0,(LPARAM)(HTREEITEM)hTreeItem); } inline WORD TreeView::expand(HTREEITEM hTreeItem,WPARAM code) { if(!isOkay())return FALSE; return ::SendMessage(mhTreeViewWnd,TVM_EXPAND,(WPARAM)code,(LPARAM)(HTREEITEM)hTreeItem); } inline UINT TreeView::getCount(void)const { if(!isOkay())return FALSE; return (UINT)::SendMessage(mhTreeViewWnd,TVM_GETCOUNT,0,0L); } inline UINT TreeView::getIndent(void) { if(!isOkay())return FALSE; return (UINT)::SendMessage(mhTreeViewWnd,TVM_GETINDENT,0,0L); } inline WORD TreeView::setIndent(WORD indent) { if(!isOkay())return FALSE; return (WORD)::SendMessage(mhTreeViewWnd,TVM_SETINDENT,(WPARAM)indent,0L); } inline HIMAGELIST TreeView::getImageList(ListType listType) { if(!isOkay())return FALSE; return (HIMAGELIST)::SendMessage(mhTreeViewWnd,TVM_GETIMAGELIST,(WPARAM)listType,0L); } inline HIMAGELIST TreeView::setImageList(ImageList &someImageList,WORD indexImage) { if(!isOkay()||!someImageList.isOkay())return FALSE; return (HIMAGELIST)::SendMessage(mhTreeViewWnd,TVM_SETIMAGELIST,indexImage,(LPARAM)(HIMAGELIST)someImageList); } inline HTREEITEM TreeView::getNextItem(HTREEITEM hTreeItem,WPARAM code)const { if(!isOkay())return FALSE; return (HTREEITEM)::SendMessage(mhTreeViewWnd,TVM_GETNEXTITEM,(WPARAM)code,(LPARAM)(HTREEITEM)hTreeItem); } inline HTREEITEM TreeView::getChild(HTREEITEM hTreeItem)const { return getNextItem(hTreeItem,TVGN_CHILD); } inline HTREEITEM TreeView::getNextSibling(HTREEITEM hTreeItem)const { return getNextItem(hTreeItem,TVGN_NEXT); } inline HTREEITEM TreeView::getPrevSibling(HTREEITEM hTreeItem) { return getNextItem(hTreeItem,TVGN_PREVIOUS); } inline HTREEITEM TreeView::getParent(HTREEITEM hTreeItem)const { return getNextItem(hTreeItem,TVGN_PARENT); } inline HTREEITEM TreeView::getFirstVisible(void) { return getNextItem(0,TVGN_FIRSTVISIBLE); } inline HTREEITEM TreeView::getNextVisible(HTREEITEM hTreeItem) { return getNextItem(hTreeItem,TVGN_NEXTVISIBLE); } inline HTREEITEM TreeView::getPrevVisible(HTREEITEM hTreeItem) { return getNextItem(hTreeItem,TVGN_PREVIOUSVISIBLE); } inline HTREEITEM TreeView::getSelection(void)const { return getNextItem(0,TVGN_CARET); } inline HTREEITEM TreeView::getDropHilight(void) { return getNextItem(0,TVGN_DROPHILITE); } inline HTREEITEM TreeView::getRoot(void)const { return getNextItem(0,TVGN_ROOT); } inline HTREEITEM TreeView::select(HTREEITEM hTreeItem,WPARAM code)const { if(!isOkay())return FALSE; return (HTREEITEM)::SendMessage(mhTreeViewWnd,TVM_SELECTITEM,(WPARAM)code,(LPARAM)(HTREEITEM)(hTreeItem)); } inline HTREEITEM TreeView::selectItem(HTREEITEM hTreeItem)const { return select(hTreeItem,TVGN_CARET); } inline HTREEITEM TreeView::selectDropTarget(HTREEITEM hTreeItem)const { return select(hTreeItem,TVGN_DROPHILITE); } inline HTREEITEM TreeView::selectSetFirstVisible(HTREEITEM hTreeItem) { return select(hTreeItem,TVGN_FIRSTVISIBLE); } inline WORD TreeView::getItem(TreeViewItem &someTreeViewItem)const { if(!isOkay())return FALSE; return (WORD)::SendMessage(mhTreeViewWnd,TVM_GETITEM,0,(LPARAM)&((TV_ITEM&)someTreeViewItem)); } inline WORD TreeView::setItem(const TreeViewItem &someTreeViewItem)const { if(!isOkay())return FALSE; return (WORD)::SendMessage(mhTreeViewWnd,TVM_SETITEM,0,(LPARAM)&((TV_ITEM&)(TreeViewItem&)someTreeViewItem)); } inline HWND TreeView::getEditLabel(HTREEITEM hTreeItem) { if(!isOkay())return FALSE; return (HWND)::SendMessage(mhTreeViewWnd,TVM_EDITLABEL,0,(LPARAM)(HTREEITEM)hTreeItem); } inline HWND TreeView::getEditControl(void)const { if(!isOkay())return FALSE; return (HWND)::SendMessage(mhTreeViewWnd,TVM_GETEDITCONTROL,0,0L); } inline UINT TreeView::getVisibleCount(void) { if(!isOkay())return FALSE; return (UINT)::SendMessage(mhTreeViewWnd,TVM_GETVISIBLECOUNT,0,0L); } inline HIMAGELIST TreeView::createDragImage(HTREEITEM hTreeItem) { if(!isOkay())return FALSE; return (HIMAGELIST)::SendMessage(mhTreeViewWnd,TVM_CREATEDRAGIMAGE,0,(LPARAM)(HTREEITEM)hTreeItem); } inline WORD TreeView::sortChildren(HTREEITEM hTreeItem,WPARAM recurse) { if(!isOkay())return FALSE; return ::SendMessage(mhTreeViewWnd,TVM_SORTCHILDREN,(WPARAM)recurse,(LPARAM)(HTREEITEM)hTreeItem); } inline WORD TreeView::ensureVisible(HTREEITEM hTreeItem) { if(!isOkay())return FALSE; return ::SendMessage(mhTreeViewWnd,TVM_ENSUREVISIBLE,(WPARAM)0,(LPARAM)(HTREEITEM)hTreeItem); } inline WORD TreeView::endEditLabelNow(WPARAM cancel) { if(!isOkay())return FALSE; return ::SendMessage(mhTreeViewWnd,TVM_ENDEDITLABELNOW,(WPARAM)cancel,0L); } inline WORD TreeView::getISearchString(String &searchString) { if(!isOkay())return FALSE; return (WORD)::SendMessage(mhTreeViewWnd,TVM_GETISEARCHSTRING,0,(LPARAM)(LPSTR)searchString); } inline WORD TreeView::getItemRect(Rect &itemRect,BOOL boundingText)const { if(!isOkay())return FALSE; *((HTREEITEM*)&((RECT&)itemRect))=getSelection(); return (WORD)::SendMessage(mhTreeViewWnd,TVM_GETITEMRECT,boundingText,(LPARAM)&((RECT&)itemRect)); } inline WORD TreeView::getItemRect(Rect &itemRect,HTREEITEM hTreeItem,BOOL boundingText)const { if(!isOkay())return FALSE; *((HTREEITEM*)&((RECT&)itemRect))=hTreeItem; return (WORD)::SendMessage(mhTreeViewWnd,TVM_GETITEMRECT,boundingText,(LPARAM)&((RECT&)itemRect)); } inline WORD TreeView::setRedraw(WORD redrawFlag)const { if(!isOkay())return FALSE; return (WORD)::SendMessage(mhTreeViewWnd,WM_SETREDRAW,redrawFlag,0L); } inline BOOL TreeView::update(void)const { if(!isOkay())return FALSE; return ::UpdateWindow(mhTreeViewWnd); } inline BOOL TreeView::invalidate(void)const { if(!isOkay())return FALSE; return ::InvalidateRect(mhTreeViewWnd,0,FALSE); } inline WORD TreeView::moveTree(int left,int top,int right,int bottom,WORD repaint)const { if(!isOkay())return FALSE; return ::MoveWindow(mhTreeViewWnd,left,top,right,bottom,repaint); } inline WORD TreeView::setFocus(void)const { if(!isOkay())return FALSE; ::SetFocus(mhTreeViewWnd); return TRUE; } inline WORD TreeView::remove(const String &nodeName)const { if(!isOkay())return FALSE; HTREEITEM hTreeItem(searchItem(nodeName)); if(!hTreeItem)return FALSE; return remove(hTreeItem); } inline const TreeViewInsert &TreeView::lastInsert(void)const { return mLastInsert; } inline HWND TreeView::getControlWnd(void)const { return mhTreeViewWnd; } inline int TreeView::controlID(void)const { return mControlID; } inline WORD TreeView::isOkay(void)const { return (mhTreeViewWnd?TRUE:FALSE); } #endif