454 lines
13 KiB
Plaintext
454 lines
13 KiB
Plaintext
#ifndef _IMAGELIST_TREEVIEW_HPP_
|
|
#define _IMAGELIST_TREEVIEW_HPP_
|
|
#ifndef _COMMON_WINDOWS_HPP_
|
|
#include <common/windows.hpp>
|
|
#endif
|
|
#ifndef _COMMON_COMMCTRL_HPP_
|
|
#include <common/commctrl.hpp>
|
|
#endif
|
|
#ifndef _COMMON_STRING_HPP_
|
|
#include <common/string.hpp>
|
|
#endif
|
|
#ifndef _COMMON_RECTANGLE_HPP_
|
|
#include <common/rect.hpp>
|
|
#endif
|
|
#ifndef _COMMON_CALLBACK_HPP_
|
|
#include <common/callback.hpp>
|
|
#endif
|
|
#ifndef _IMAGELIST_IMAGELIST_HPP_
|
|
#include <imagelst/imagelst.hpp>
|
|
#endif
|
|
#ifndef _IMAGELIST_TREEVIEWINSERT_HPP_
|
|
#include <imagelst/tvinsert.hpp>
|
|
#endif
|
|
#ifndef _IMAGELIST_TREEVIEWITEM_HPP_
|
|
#include <imagelst/tvitem.hpp>
|
|
#endif
|
|
#ifndef _COMMON_HOOKPROC_HPP_
|
|
#include <common/hookproc.hpp>
|
|
#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<TreeView> 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
|