@@ -7,8 +7,10 @@ namespace WAS
7
7
{
8
8
9
9
NodeTreeView::NodeTreeView () :
10
- listHandle (NULL ),
10
+ treeHandle (NULL ),
11
11
imageList (NULL ),
12
+ groupClosedBitmap (-1 ),
13
+ groupOpenedBitmap (-1 ),
12
14
groups ()
13
15
{
14
16
@@ -23,43 +25,46 @@ NodeTreeView::~NodeTreeView ()
23
25
24
26
bool NodeTreeView::Init (HWND parentHandle, int x, int y, int width, int height)
25
27
{
26
- listHandle = CreateWindowEx (
28
+ treeHandle = CreateWindowEx (
27
29
0 , WC_TREEVIEW, NULL , WS_VISIBLE | WS_CHILD | TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_SHOWSELALWAYS,
28
30
x, y, width, height, parentHandle, NULL , NULL , NULL
29
31
);
30
- if (DBGERROR (listHandle == NULL )) {
32
+ if (DBGERROR (treeHandle == NULL )) {
31
33
return false ;
32
34
}
35
+ TreeView_SetItemHeight (treeHandle, 20 );
33
36
return true ;
34
37
}
35
38
36
- bool NodeTreeView::InitImageList ()
39
+ bool NodeTreeView::InitImageList (HBITMAP closedBitmap, HBITMAP openedBitmap )
37
40
{
38
41
if (DBGERROR (imageList != NULL )) {
39
42
return false ;
40
43
}
41
- imageList = ImageList_Create (18 , 18 , ILC_COLOR32, 1 , 1 );
44
+ imageList = ImageList_Create (18 , 18 , ILC_COLOR32, 2 , 1 );
42
45
if (DBGERROR (imageList == NULL )) {
43
46
return false ;
44
47
}
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);
46
51
return true ;
47
52
}
48
53
49
54
void NodeTreeView::Resize (int x, int y, int width, int height)
50
55
{
51
- if (listHandle == NULL ) {
56
+ if (treeHandle == NULL ) {
52
57
return ;
53
58
}
54
- MoveWindow (listHandle , x, y, width, height, TRUE );
59
+ MoveWindow (treeHandle , x, y, width, height, TRUE );
55
60
}
56
61
57
62
bool NodeTreeView::HasGroup (const std::wstring& group) const
58
63
{
59
64
return groups.find (group) != groups.end ();
60
65
}
61
66
62
- void NodeTreeView::AddGroup (const std::wstring& group, HBITMAP bitmap )
67
+ void NodeTreeView::AddGroup (const std::wstring& group)
63
68
{
64
69
auto found = groups.find (group);
65
70
if (DBGERROR (found != groups.end ())) {
@@ -75,15 +80,13 @@ void NodeTreeView::AddGroup (const std::wstring& group, HBITMAP bitmap)
75
80
tvInsertStruct.item .cchTextMax = sizeof (tvInsertStruct.item .pszText ) / sizeof (wchar_t );
76
81
tvInsertStruct.item .lParam = (LPARAM) -1 ;
77
82
78
- if (imageList != NULL && bitmap != NULL ) {
79
- int imageIndex = ImageList_GetImageCount (imageList);
80
- ImageList_Add (imageList, bitmap, NULL );
83
+ if (imageList != NULL ) {
81
84
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 ;
84
87
}
85
88
86
- HTREEITEM groupItem = (HTREEITEM) SendMessage (listHandle , TVM_INSERTITEM, 0 , (LPARAM) &tvInsertStruct);
89
+ HTREEITEM groupItem = (HTREEITEM) SendMessage (treeHandle , TVM_INSERTITEM, 0 , (LPARAM) &tvInsertStruct);
87
90
groups.insert ({ group, groupItem });
88
91
}
89
92
@@ -104,26 +107,38 @@ void NodeTreeView::AddItem (const std::wstring& group, const std::wstring& text,
104
107
tvInsertStruct.item .lParam = lParam;
105
108
106
109
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 );
109
111
tvInsertStruct.item .mask |= TVIF_IMAGE | TVIF_SELECTEDIMAGE;
110
112
tvInsertStruct.item .iImage = imageIndex;
111
113
tvInsertStruct.item .iSelectedImage = imageIndex;
112
114
}
113
115
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);
115
130
}
116
131
117
132
void NodeTreeView::ExpandAll ()
118
133
{
119
134
for (const auto & it : groups) {
120
- TreeView_Expand (listHandle , it.second , TVM_EXPAND);
135
+ TreeView_Expand (treeHandle , it.second , TVM_EXPAND);
121
136
}
122
137
}
123
138
124
139
HWND NodeTreeView::GetListHandle ()
125
140
{
126
- return listHandle ;
141
+ return treeHandle ;
127
142
}
128
143
129
144
}
0 commit comments