22#include " Define.h"
33#include " resource.h"
44#include " StringHelper.h"
5+ #include < memory>
56
67
78void TreeViewCtrl::OnInit (HWND hParent)
@@ -43,6 +44,19 @@ auto TreeViewCtrl::InsertNode(const std::wstring &text, LPARAM lparam, HTREEITEM
4344 return item;
4445}
4546
47+ void TreeViewCtrl::UpdateNodeText (HTREEITEM node, const std::wstring &text)
48+ {
49+ auto tvi = std::make_unique<TVITEMW>();
50+ if (GetTVItem (node, tvi.get ()))
51+ {
52+ tvi->mask |= TVIF_TEXT;
53+ tvi->cchTextMax = static_cast <int >(text.size ());
54+ tvi->pszText = const_cast <wchar_t *>(text.c_str ());
55+
56+ SetTVItem (tvi.get ());
57+ }
58+ }
59+
4660bool TreeViewCtrl::IsExpanded (HTREEITEM node) const
4761{
4862 return TreeView_GetItemState (m_hTree, node, TVIS_EXPANDED) & TVIS_EXPANDED;
@@ -130,7 +144,7 @@ bool TreeViewCtrl::HasChild(HTREEITEM hti) const
130144 return htiChild ? true : false ;
131145}
132146
133- auto TreeViewCtrl::GetNodeName (HTREEITEM hti) -> std::wstring
147+ auto TreeViewCtrl::GetNodeName (HTREEITEM hti, bool removeTrailingCount ) -> std::wstring
134148{
135149 if (!hti)
136150 return TEXT (" " );
@@ -142,12 +156,44 @@ auto TreeViewCtrl::GetNodeName(HTREEITEM hti) -> std::wstring
142156 tvItem.pszText = textBuffer;
143157 tvItem.cchTextMax = MAX_PATH;
144158 SendMessage (m_hTree, TVM_GETITEM, 0 , reinterpret_cast <LPARAM>(&tvItem));
145- return tvItem.pszText ? tvItem.pszText : TEXT (" " );
159+
160+ std::wstring retVal = tvItem.pszText ? tvItem.pszText : TEXT (" " );
161+
162+ // If it is an array or list then remove trailing {} or []
163+ if (removeTrailingCount && HasChild (hti))
164+ {
165+ auto remove = [](std::wstring &input, const wchar_t ch)
166+ {
167+ wchar_t removeTill = ch == L' }' ? L' {' : L' [' ;
168+ wchar_t current = input.back ();
169+
170+ while (current != removeTill)
171+ {
172+ input.pop_back ();
173+ current = input.back ();
174+ }
175+
176+ input.pop_back (); // remove { or [
177+ input.pop_back (); // remove trailing space.
178+ };
179+
180+ if (retVal.ends_with (L" }" ))
181+ {
182+ remove (retVal, L' }' );
183+ }
184+
185+ else if (retVal.ends_with (L" ]" ))
186+ {
187+ remove (retVal, L' ]' );
188+ }
189+ }
190+
191+ return retVal;
146192}
147193
148194auto TreeViewCtrl::GetNodeKey (HTREEITEM hti) -> std::wstring
149195{
150- std::wstring retVal = GetNodeName (hti);
196+ std::wstring retVal = GetNodeName (hti, true );
151197
152198 auto pos = retVal.find (L" : " );
153199 if (pos != std::wstring::npos)
@@ -159,7 +205,7 @@ auto TreeViewCtrl::GetNodeKey(HTREEITEM hti) -> std::wstring
159205
160206auto TreeViewCtrl::GetNodeValue (HTREEITEM hti) -> std::wstring
161207{
162- std::wstring retVal = GetNodeName (hti);
208+ std::wstring retVal = GetNodeName (hti, true );
163209
164210 auto pos = retVal.find (L" : " );
165211 if (pos != std::wstring::npos)
@@ -276,13 +322,16 @@ HTREEITEM TreeViewCtrl::NextItem(HTREEITEM htiCurrent, HTREEITEM htiNextRoot)
276322 return nullptr ;
277323}
278324
279- bool TreeViewCtrl::GetTVItem (HTREEITEM hti, TCHAR *buf, int bufSize, TVITEM *tvi)
325+ bool TreeViewCtrl::GetTVItem (HTREEITEM hti, TVITEM *tvi) const
280326{
281- tvi->mask = TVIF_HANDLE | TVIF_TEXT | TVIF_PARAM;
282- tvi->cchTextMax = bufSize;
283- tvi->pszText = buf;
327+ tvi->mask = TVIF_HANDLE | TVIF_PARAM;
284328 tvi->hItem = hti;
285329 tvi->lParam = -1 ;
286330
287331 return TreeView_GetItem (m_hTree, tvi) ? true : false ;
288332}
333+
334+ bool TreeViewCtrl::SetTVItem (TVITEM *tvi) const
335+ {
336+ return TreeView_SetItem (m_hTree, tvi) ? true : false ;
337+ }
0 commit comments