@@ -7,8 +7,10 @@ namespace WAS
77{
88
99NodeTreeView::NodeTreeView () :
10- listHandle (NULL ),
10+ treeHandle (NULL ),
1111 imageList (NULL ),
12+ groupClosedBitmap (-1 ),
13+ groupOpenedBitmap (-1 ),
1214 groups ()
1315{
1416
@@ -23,43 +25,46 @@ NodeTreeView::~NodeTreeView ()
2325
2426bool NodeTreeView::Init (HWND parentHandle, int x, int y, int width, int height)
2527{
26- listHandle = CreateWindowEx (
28+ treeHandle = CreateWindowEx (
2729 0 , WC_TREEVIEW, NULL , WS_VISIBLE | WS_CHILD | TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_SHOWSELALWAYS,
2830 x, y, width, height, parentHandle, NULL , NULL , NULL
2931 );
30- if (DBGERROR (listHandle == NULL )) {
32+ if (DBGERROR (treeHandle == NULL )) {
3133 return false ;
3234 }
35+ TreeView_SetItemHeight (treeHandle, 20 );
3336 return true ;
3437}
3538
36- bool NodeTreeView::InitImageList ()
39+ bool NodeTreeView::InitImageList (HBITMAP closedBitmap, HBITMAP openedBitmap )
3740{
3841 if (DBGERROR (imageList != NULL )) {
3942 return false ;
4043 }
41- imageList = ImageList_Create (18 , 18 , ILC_COLOR32, 1 , 1 );
44+ imageList = ImageList_Create (18 , 18 , ILC_COLOR32, 2 , 1 );
4245 if (DBGERROR (imageList == NULL )) {
4346 return false ;
4447 }
45- TreeView_SetImageList (listHandle, imageList, TVSIL_NORMAL);
48+ groupClosedBitmap = ImageList_Add (imageList, closedBitmap, NULL );
49+ groupOpenedBitmap = ImageList_Add (imageList, openedBitmap, NULL );
50+ TreeView_SetImageList (treeHandle, imageList, TVSIL_NORMAL);
4651 return true ;
4752}
4853
4954void NodeTreeView::Resize (int x, int y, int width, int height)
5055{
51- if (listHandle == NULL ) {
56+ if (treeHandle == NULL ) {
5257 return ;
5358 }
54- MoveWindow (listHandle , x, y, width, height, TRUE );
59+ MoveWindow (treeHandle , x, y, width, height, TRUE );
5560}
5661
5762bool NodeTreeView::HasGroup (const std::wstring& group) const
5863{
5964 return groups.find (group) != groups.end ();
6065}
6166
62- void NodeTreeView::AddGroup (const std::wstring& group, HBITMAP bitmap )
67+ void NodeTreeView::AddGroup (const std::wstring& group)
6368{
6469 auto found = groups.find (group);
6570 if (DBGERROR (found != groups.end ())) {
@@ -75,15 +80,13 @@ void NodeTreeView::AddGroup (const std::wstring& group, HBITMAP bitmap)
7580 tvInsertStruct.item .cchTextMax = sizeof (tvInsertStruct.item .pszText ) / sizeof (wchar_t );
7681 tvInsertStruct.item .lParam = (LPARAM) -1 ;
7782
78- if (imageList != NULL && bitmap != NULL ) {
79- int imageIndex = ImageList_GetImageCount (imageList);
80- ImageList_Add (imageList, bitmap, NULL );
83+ if (imageList != NULL ) {
8184 tvInsertStruct.item .mask |= TVIF_IMAGE | TVIF_SELECTEDIMAGE;
82- tvInsertStruct.item .iImage = imageIndex ;
83- tvInsertStruct.item .iSelectedImage = imageIndex ;
85+ tvInsertStruct.item .iImage = groupClosedBitmap ;
86+ tvInsertStruct.item .iSelectedImage = groupClosedBitmap ;
8487 }
8588
86- HTREEITEM groupItem = (HTREEITEM) SendMessage (listHandle , TVM_INSERTITEM, 0 , (LPARAM) &tvInsertStruct);
89+ HTREEITEM groupItem = (HTREEITEM) SendMessage (treeHandle , TVM_INSERTITEM, 0 , (LPARAM) &tvInsertStruct);
8790 groups.insert ({ group, groupItem });
8891}
8992
@@ -104,26 +107,38 @@ void NodeTreeView::AddItem (const std::wstring& group, const std::wstring& text,
104107 tvInsertStruct.item .lParam = lParam;
105108
106109 if (imageList != NULL && bitmap != NULL ) {
107- int imageIndex = ImageList_GetImageCount (imageList);
108- ImageList_Add (imageList, bitmap, NULL );
110+ int imageIndex = ImageList_Add (imageList, bitmap, NULL );
109111 tvInsertStruct.item .mask |= TVIF_IMAGE | TVIF_SELECTEDIMAGE;
110112 tvInsertStruct.item .iImage = imageIndex;
111113 tvInsertStruct.item .iSelectedImage = imageIndex;
112114 }
113115
114- SendMessage (listHandle, TVM_INSERTITEM, 0 , (LPARAM) &tvInsertStruct);
116+ SendMessage (treeHandle, TVM_INSERTITEM, 0 , (LPARAM) &tvInsertStruct);
117+ }
118+
119+ void NodeTreeView::GroupExpanded (const TVITEMW& group)
120+ {
121+ TVITEM newGroup = group;
122+ if (group.state & TVIS_EXPANDED) {
123+ newGroup.iImage = groupOpenedBitmap;
124+ newGroup.iSelectedImage = groupOpenedBitmap;
125+ } else {
126+ newGroup.iImage = groupClosedBitmap;
127+ newGroup.iSelectedImage = groupClosedBitmap;
128+ }
129+ TreeView_SetItem (treeHandle, &newGroup);
115130}
116131
117132void NodeTreeView::ExpandAll ()
118133{
119134 for (const auto & it : groups) {
120- TreeView_Expand (listHandle , it.second , TVM_EXPAND);
135+ TreeView_Expand (treeHandle , it.second , TVM_EXPAND);
121136 }
122137}
123138
124139HWND NodeTreeView::GetListHandle ()
125140{
126- return listHandle ;
141+ return treeHandle ;
127142}
128143
129144}
0 commit comments