#pragma once
|
|
#include "wobject/xcontrol.hpp"
|
#include "win32/win.hpp"
|
|
typedef struct _TREEITEM{} *HTREEITEM;
|
|
#define TVI_ROOT ((HTREEITEM)(ULONG_PTR)-0x10000)
|
#define TVI_FIRST ((HTREEITEM)(ULONG_PTR)-0x0FFFF)
|
#define TVI_LAST ((HTREEITEM)(ULONG_PTR)-0x0FFFE)
|
#define TVI_SORT ((HTREEITEM)(ULONG_PTR)-0x0FFFD)
|
|
#define TVIF_TEXT 0x0001
|
#define TVIF_IMAGE 0x0002
|
#define TVIF_PARAM 0x0004
|
#define TVIF_STATE 0x0008
|
#define TVIF_HANDLE 0x0010
|
#define TVIF_SELECTEDIMAGE 0x0020
|
#define TVIF_CHILDREN 0x0040
|
#define TVIF_INTEGRAL 0x0080
|
|
#define TVIF_STATEEX 0x0100
|
#define TVIF_EXPANDEDIMAGE 0x0200
|
|
#define TVIS_SELECTED 0x0002
|
#define TVIS_CUT 0x0004
|
#define TVIS_DROPHILITED 0x0008
|
#define TVIS_BOLD 0x0010
|
#define TVIS_EXPANDED 0x0020
|
#define TVIS_EXPANDEDONCE 0x0040
|
#define TVIS_EXPANDPARTIAL 0x0080
|
|
#define TVIS_OVERLAYMASK 0x0F00
|
#define TVIS_STATEIMAGEMASK 0xF000
|
#define TVIS_USERMASK 0xF000
|
|
#define TVGN_ROOT 0x0000
|
#define TVGN_NEXT 0x0001
|
#define TVGN_PREVIOUS 0x0002
|
#define TVGN_PARENT 0x0003
|
#define TVGN_CHILD 0x0004
|
#define TVGN_FIRSTVISIBLE 0x0005
|
#define TVGN_NEXTVISIBLE 0x0006
|
#define TVGN_PREVIOUSVISIBLE 0x0007
|
#define TVGN_DROPHILITE 0x0008
|
#define TVGN_CARET 0x0009
|
#define TVGN_LASTVISIBLE 0x000A
|
#define TVGN_NEXTSELECTED 0x000B
|
|
#define TV_FIRST 0x1100
|
|
struct SCROLLINFO
|
{
|
int cbSize;
|
int fMask;
|
int nMin;
|
int nMax;
|
int nPage;
|
int nPos;
|
int nTrackPos;
|
};
|
|
struct tvitem
|
{
|
int mask;
|
HTREEITEM hItem;
|
int state;
|
int stateMask;
|
string pszText;
|
int cchTextMax;
|
int iImage;
|
int iSelectedImage;
|
int cChildren;
|
LPARAM lParam;
|
};
|
|
struct tvinsertstruct
|
{
|
HTREEITEM hParent;
|
HTREEITEM hInsertAfter;
|
tvitem item;
|
};
|
|
|
struct NMTREEVIEW : public NMHDR
|
{
|
int action;
|
tvitem itemOld;
|
tvitem itemNew;
|
xpoint ptDrag;
|
};
|
|
|
struct TVNNMHDR : public NMHDR
|
{
|
HTREEITEM FromItem;
|
HTREEITEM ToItem;
|
xpoint pt;
|
string PopupMenu;
|
};
|
|
struct NMTVDISPINFO : public NMHDR
|
{
|
tvitem item;
|
};
|
|
struct TVHITTESTINFO {
|
xpoint pt;
|
int flags;
|
HTREEITEM hItem;
|
};
|
|
class xtreeview: public xcontrol
|
{
|
public:
|
xtreeview() :xcontrol(nullptr) {}
|
xtreeview(void* implptr) :xcontrol(implptr) {}
|
public:
|
HTREEITEM GetSelectedItem()
|
{
|
int TVM_GETNEXTITEM = TV_FIRST + 10;
|
|
return (HTREEITEM)SendMessage(GetHWND(), TVM_GETNEXTITEM, TVGN_CARET,0);
|
}
|
|
string GetItemLabel(HTREEITEM hItem)
|
{
|
int TVM_GETITEM = TV_FIRST + 62;
|
|
tvitem tvi ;
|
tvi.hItem = hItem;
|
tvi.mask = TVIF_TEXT;
|
|
wchar_t buf[255]=L"";
|
tvi.pszText = buf;
|
tvi.cchTextMax = 255;
|
SendMessage(GetHWND(), TVM_GETITEM, 0,(LPARAM)&tvi);
|
return tvi.pszText;
|
}
|
|
int SetItemLabel(HTREEITEM hItem,string label)
|
{
|
int TVM_SETITEM = TV_FIRST + 63;
|
|
tvitem tvi ;
|
tvi.hItem = hItem;
|
tvi.mask = TVIF_TEXT;
|
tvi.pszText = label;
|
tvi.cchTextMax =9999;//label.length()+ 1;
|
|
SendMessage(GetHWND(), TVM_SETITEM, 0,(LPARAM)&tvi);
|
return 1;
|
}
|
|
LPARAM GetItemData(HTREEITEM hItem)
|
{
|
int TVM_GETITEM = TV_FIRST + 62;
|
|
//ref tvitem tvi =new tvitem;
|
tvitem tvi;
|
tvi.hItem = hItem;
|
|
wchar_t buf[255];
|
tvi.pszText = buf;
|
tvi.cchTextMax = 255;
|
tvi.mask = TVIF_PARAM|TVIF_TEXT;
|
|
SendMessage(GetHWND(), TVM_GETITEM, 0,(LPARAM)&tvi);
|
return tvi.lParam;
|
}
|
|
int SetItemData(HTREEITEM hItem,LPARAM value)
|
{
|
int TVM_SETITEM = TV_FIRST + 63;
|
|
tvitem tvi ;
|
tvi.hItem = hItem;
|
tvi.mask = TVIF_PARAM;
|
tvi.lParam = value;
|
|
SendMessage(GetHWND(), TVM_SETITEM, 0,(LPARAM)&tvi);
|
return 1;
|
}
|
|
int DeleteItem( HTREEITEM hItem)
|
{
|
int TVM_DELETEITEM = TV_FIRST + 1;
|
|
SendMessage(GetHWND(), TVM_DELETEITEM, 0,(LPARAM)hItem);
|
return 1;
|
}
|
|
int ExpandItem(HTREEITEM hItem)
|
{
|
int TVE_COLLAPSE = 0x0001;
|
int TVE_EXPAND = 0x0002;
|
int TVE_TOGGLE = 0x0003;
|
int TVE_EXPANDPARTIAL = 0x4000;
|
int TVE_COLLAPSERESET = 0x8000;
|
|
int TVM_EXPAND = TV_FIRST + 2;
|
|
SendMessage(GetHWND(), TVM_EXPAND, TVE_EXPAND|TVE_EXPANDPARTIAL ,(LPARAM)hItem);
|
return 1;
|
}
|
|
int ExpandItem(HTREEITEM hItem, int flag)
|
{
|
int TVM_EXPAND = TV_FIRST + 2;
|
|
return SendMessage(GetHWND(), TVM_EXPAND, (WPARAM)flag ,(LPARAM)hItem);
|
}
|
|
HTREEITEM GetItem(HTREEITEM hItem,int code)
|
{
|
int TVM_GETNEXTITEM = TV_FIRST + 10 ;
|
return (HTREEITEM)SendMessage(GetHWND(), TVM_GETNEXTITEM, code,(LPARAM)hItem);
|
}
|
|
HTREEITEM GetRootItem()
|
{
|
return GetItem(NULL,TVGN_ROOT);
|
}
|
HTREEITEM GetNextItem(HTREEITEM hItem)
|
{
|
return GetItem(hItem,TVGN_NEXT);
|
}
|
HTREEITEM GetPrevItem(HTREEITEM hItem)
|
{
|
return GetItem(hItem,TVGN_PREVIOUS );
|
}
|
HTREEITEM GetParentItem(HTREEITEM hItem)
|
{
|
return GetItem(hItem,TVGN_PARENT );
|
}
|
HTREEITEM GetChildItem(HTREEITEM hItem)
|
{
|
return GetItem(hItem,TVGN_CHILD );
|
}
|
|
HTREEITEM GetFirstVisibleItem(HTREEITEM hItem)
|
{
|
return GetItem(hItem,TVGN_FIRSTVISIBLE );
|
}
|
HTREEITEM GetNextVisibleItem(HTREEITEM hItem)
|
{
|
return GetItem(hItem,TVGN_NEXTVISIBLE );
|
}
|
HTREEITEM GetPrevVisibleItem(HTREEITEM hItem)
|
{
|
return GetItem(hItem,TVGN_PREVIOUSVISIBLE );
|
}
|
HTREEITEM GetDropHiliteItem(HTREEITEM hItem)
|
{
|
return GetItem(hItem,TVGN_DROPHILITE );
|
}
|
|
HTREEITEM GetCaretItem()
|
{
|
return GetItem(NULL,TVGN_CARET );
|
}
|
HTREEITEM GetLastVisibleItem(HTREEITEM hItem)
|
{
|
return GetItem(hItem,TVGN_LASTVISIBLE );
|
}
|
|
int ExpandItemEx(HTREEITEM hItem)
|
{
|
int TVE_EXPAND = 0x2;
|
int TVM_EXPAND = 0x1102;
|
return SendMessage(GetHWND(),TVM_EXPAND,TVE_EXPAND,(LPARAM)hItem);
|
}
|
int CloseItemEx(HTREEITEM hItem)
|
{
|
int TVE_COLLAPSE = 0x1;
|
int TVM_EXPAND = 0x1102;
|
return SendMessage(GetHWND(),TVM_EXPAND,TVE_COLLAPSE,(LPARAM)hItem);
|
}
|
|
int ExpandItemAll(HTREEITEM hItem)
|
{
|
ExpandItemEx(hItem);
|
HTREEITEM hcItem =GetChildItem(hItem);
|
if(hcItem)
|
{
|
ExpandItemAll(hcItem);
|
while(GetNextItem(hcItem))
|
{
|
hcItem = GetNextItem(hcItem);
|
ExpandItemAll(hcItem);
|
}
|
}
|
return 1;
|
}
|
|
HTREEITEM InsertItem(HTREEITEM hItem,HTREEITEM hBeforeItem, string label,LPARAM data,int image = 0)
|
{
|
int TVM_INSERTITEM = TV_FIRST + 50;
|
tvinsertstruct tvis;
|
tvis.item.mask = TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_TEXT|TVIF_HANDLE;
|
tvis.item.pszText = label;
|
tvis.item.cchTextMax = 255;
|
tvis.item.lParam = data;
|
tvis.item.iImage = image;
|
tvis.item.iSelectedImage = image;
|
|
tvis.hParent = hItem;
|
HTREEITEM hItemAfter = 0;
|
if(hBeforeItem)
|
{
|
hItemAfter = GetItem(hBeforeItem,TVGN_PREVIOUS );
|
}
|
if(hItemAfter ==0) hItemAfter = TVI_FIRST;
|
tvis.hInsertAfter = hItemAfter;
|
|
HTREEITEM h;
|
h = (HTREEITEM)SendMessage(GetHWND(), TVM_INSERTITEM, 0,(LPARAM)&tvis);
|
return h;
|
}
|
|
HTREEITEM InsertItem(HTREEITEM hBeforeItem, string label,LPARAM data,int image = 0)
|
{
|
//int TVI_ROOT = 0 - 65536;
|
HTREEITEM hItem= GetParentItem(hBeforeItem);
|
if(hItem==0) hItem = TVI_ROOT;
|
return InsertItem(hItem, hBeforeItem,label,data,image);
|
}
|
|
HTREEITEM InsertItem(string label,LPARAM data,int image = 0)
|
{
|
HTREEITEM hBeforeItem = GetCaretItem();
|
return InsertItem(hBeforeItem,label,data,image);
|
}
|
|
int SetItemChild1(HTREEITEM hItem, int cchild)
|
{
|
return SetItemChild(hItem, cchild);
|
}
|
|
int SetItemChild(HTREEITEM hItem, int cchild)
|
{
|
int TVM_SETITEM = TV_FIRST + 63;
|
|
tvitem tvi;
|
tvi.hItem = hItem;
|
tvi.mask = TVIF_CHILDREN|TVIF_HANDLE ;
|
tvi.cChildren = cchild;
|
SendMessage(GetHWND(), TVM_SETITEM, 0,(LPARAM)&tvi);
|
return 1;
|
}
|
|
HTREEITEM InsertChildItem(HTREEITEM hItem, string label, KXMLDOMElement ele, int image = 0)
|
{
|
return InsertChildItem(hItem, label, ele.ptr(), image);
|
}
|
|
HTREEITEM InsertChildItem(HTREEITEM hItem,string label,LPARAM data,int image = 0)
|
{
|
HTREEITEM h;
|
int TVM_INSERTITEM = TV_FIRST + 50;
|
int TVM_SETITEM = TV_FIRST + 63;
|
|
tvinsertstruct tvis;
|
tvis.item.mask = TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_TEXT;
|
tvis.item.pszText = label;
|
tvis.item.cchTextMax = 255;
|
tvis.item.lParam = data;
|
tvis.item.iImage = image;
|
tvis.item.iSelectedImage = image;
|
|
tvis.hParent = hItem;
|
tvis.hInsertAfter = TVI_LAST;
|
|
h = (HTREEITEM)SendMessage(GetHWND(), TVM_INSERTITEM, 0,(LPARAM)&tvis);
|
|
tvitem tvi;
|
tvi.hItem = hItem;
|
tvi.mask = TVIF_CHILDREN|TVIF_HANDLE ;
|
tvi.cChildren = 1;
|
SendMessage(GetHWND(), TVM_SETITEM, 0,(LPARAM)&tvi);
|
|
return h;
|
}
|
|
HTREEITEM InsertChildItemEx(HTREEITEM hItem, string label, KXMLDOMElement ele, int image = 0, int image2 = 0)
|
{
|
return InsertChildItemEx(hItem, label, ele.ptr(), image,image2);
|
}
|
|
HTREEITEM InsertChildItemEx(HTREEITEM hItem,string label,int data,int image = 0,int image2 = 0)
|
{
|
int TVM_INSERTITEM = TV_FIRST + 50;
|
|
tvinsertstruct tvis;
|
tvis.hParent = hItem;
|
tvis.hInsertAfter = TVI_LAST;
|
|
tvis.item.mask = TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_TEXT;
|
tvis.item.pszText = label;
|
tvis.item.cchTextMax = 255;
|
tvis.item.lParam = data;
|
tvis.item.iImage = image;
|
tvis.item.iSelectedImage = image2;
|
|
//LPTV_INSERTSTRUCT lpis;
|
HTREEITEM h;
|
h = (HTREEITEM)SendMessage(GetHWND(), TVM_INSERTITEM, 0, (LPARAM)&tvis);
|
return h;
|
}
|
|
int GetChecked(HTREEITEM hItem)
|
{
|
int TVM_GETITEMA = (TV_FIRST + 12);
|
int TVM_GETITEMW = (TV_FIRST + 62);
|
|
tvitem xitem;
|
xitem.mask = TVIF_STATE | TVIF_HANDLE | TVIF_CHILDREN;
|
xitem.stateMask = TVIS_STATEIMAGEMASK;
|
xitem.hItem = hItem;
|
|
SendMessage(GetHWND(), TVM_GETITEMW, 0, (LPARAM)&xitem);
|
int s = xitem.state;
|
//trace("%d=%d", s, s / 4096);
|
if ((s / 4096) > 1) //4096=2^12 打勾
|
return 1;
|
else
|
return 0;
|
}
|
|
int SetChecked(HTREEITEM hItem, int check)
|
{
|
int TVM_SETITEMA = (TV_FIRST + 13);
|
int TVM_SETITEMW = (TV_FIRST + 63);
|
int TVM_GETITEMW = (TV_FIRST + 62);
|
|
tvitem xitem;
|
xitem.mask = TVIF_STATE | TVIF_HANDLE | TVIF_CHILDREN | TVIF_IMAGE | TVIF_PARAM;
|
xitem.stateMask = TVIS_STATEIMAGEMASK;
|
xitem.hItem = hItem;
|
SendMessage(GetHWND(), TVM_GETITEMW, 0, (LPARAM)&xitem);
|
if (check == 1) //打勾
|
xitem.state = 4096 * 2; //INDEXTOSTATEIMAGEMASK(2);
|
else
|
xitem.state = 4096; //INDEXTOSTATEIMAGEMASK(1);
|
|
return SendMessage(GetHWND(), TVM_SETITEMW, 0, (LPARAM)&xitem);
|
}
|
|
HTREEITEM ItemFocus(HTREEITEM hItem)
|
{
|
int TVM_SELECTITEM = 0x110b;
|
return (HTREEITEM)SendMessage(GetHWND(),TVM_SELECTITEM,TVGN_CARET,(LPARAM)hItem);
|
}
|
|
int ItemEdit(HTREEITEM hItem)
|
{
|
ItemFocus(hItem);
|
int TVM_EDITLABEL = (TV_FIRST + 65) ;
|
//int TVM_EDITLABEL = (TV_FIRST + 14) ;
|
return SendMessage(GetHWND(), TVM_EDITLABEL, 0, (LPARAM)hItem);
|
}
|
|
int GetItemImage(HTREEITEM hItem)
|
{
|
int TVM_GETITEMA = (TV_FIRST + 12);
|
int TVM_GETITEMW = (TV_FIRST + 62);
|
|
tvitem xitem;
|
xitem.mask = TVIF_IMAGE;
|
xitem.stateMask = TVIS_STATEIMAGEMASK;
|
xitem.hItem = hItem;
|
SendMessage(GetHWND(), TVM_GETITEMW, 0, (LPARAM)&xitem);
|
return xitem.iImage;
|
}
|
|
int SetItemImage(HTREEITEM hItem, int image)
|
{
|
int TVM_GETITEMA = (TV_FIRST + 12);
|
int TVM_GETITEMW = (TV_FIRST + 62);
|
int TVM_SETITEMW = (TV_FIRST + 63);
|
|
tvitem xitem;
|
xitem.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE;
|
xitem.stateMask = TVIS_STATEIMAGEMASK;
|
xitem.hItem = hItem;
|
xitem.iImage = image;
|
xitem.iSelectedImage = image;
|
SendMessage(GetHWND(), TVM_SETITEMW, 0, (LPARAM)&xitem);
|
return 1;
|
}
|
|
int GetItemChild1(HTREEITEM hItem)
|
{
|
return GetItemChild(hItem);
|
}
|
|
int GetItemChild(HTREEITEM hItem)
|
{
|
int TVM_GETITEMW = (TV_FIRST + 62);
|
|
tvitem xitem;
|
xitem.hItem = hItem;
|
xitem.mask = TVIF_CHILDREN|TVIF_HANDLE ;
|
xitem.stateMask = TVIS_STATEIMAGEMASK;
|
SendMessage(GetHWND(), TVM_GETITEMW, 0,(LPARAM)&xitem);
|
return xitem.cChildren;
|
}
|
#if 0
|
string PopupMenu(string str)
|
{
|
return (str)SendMessage(GetHWND(), 0x402, (WPARAM)str, 0);
|
}
|
|
string PopupMenu(KXMLDOMElement e)
|
{
|
return PopupMenu(e.xml);
|
}
|
#endif
|
|
void SetLineAtRoot(bool value)
|
{
|
|
int GWL_STYLE = -16;
|
int TVS_LINESATROOT = 0x0004;
|
int style = GetWindowLong(GetHWND(), GWL_STYLE);
|
if (value)
|
SetWindowLong(GetHWND(), GWL_STYLE, style | TVS_LINESATROOT);
|
else
|
SetWindowLong(GetHWND(), GWL_STYLE, style & ~TVS_LINESATROOT);
|
}
|
|
};
|