Skip to content

Commit 2c0e36a

Browse files
committed
FeatureRequest: show json list/array size
fixes: #113 and closes #113
1 parent 64570ce commit 2c0e36a

File tree

6 files changed

+99
-27
lines changed

6 files changed

+99
-27
lines changed

NppJSONViewer/NppJsonViewer/JsonViewDlg.cpp

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,21 @@ HTREEITEM JsonViewDlg::InsertToTree(HTREEITEM parent, const std::string &text)
215215
return m_hTreeView->InsertNode(wText, NULL, parent);
216216
}
217217

218+
void JsonViewDlg::AppendNodeCount(HTREEITEM node, unsigned elementCount, bool bArray)
219+
{
220+
if (!node)
221+
return;
222+
223+
auto txt = m_hTreeView->GetNodeName(node, false);
224+
225+
txt += L" ";
226+
txt += bArray ? L"[" : L"{";
227+
txt += std::to_wstring(elementCount);
228+
txt += bArray ? L"]" : L"}";
229+
230+
m_hTreeView->UpdateNodeText(node, txt);
231+
}
232+
218233
void JsonViewDlg::UpdateNodePath(HTREEITEM htiNode)
219234
{
220235
std::wstring nodePath = m_hTreeView->GetNodePath(htiNode);
@@ -249,7 +264,7 @@ void JsonViewDlg::SearchInTree()
249264
}
250265

251266
// Check if this is an empty json
252-
std::wstring nodeText = m_hTreeView->GetNodeName(nextNode);
267+
std::wstring nodeText = m_hTreeView->GetNodeName(nextNode, true);
253268
if (nodeText.empty() || wcscmp(nodeText.c_str(), JSON_ERR_PARSE) == 0)
254269
{
255270
CUtility::SetEditCtrlText(::GetDlgItem(_hSelf, IDC_EDT_NODEPATH), STR_SRCH_NOTFOUND + itemToSearch);
@@ -259,7 +274,7 @@ void JsonViewDlg::SearchInTree()
259274
bool bFound = false;
260275
while (!bFound && nextNode)
261276
{
262-
nodeText = m_hTreeView->GetNodeName(nextNode);
277+
nodeText = m_hTreeView->GetNodeName(nextNode, true);
263278
auto nodeKey = m_hTreeView->GetNodeKey(nextNode);
264279
auto nodeVal = m_hTreeView->GetNodeValue(nextNode);
265280

@@ -532,7 +547,7 @@ auto JsonViewDlg::CopyName() const -> std::wstring
532547
HTREEITEM selectedNode = m_hTreeView->GetSelection();
533548
if (selectedNode)
534549
{
535-
return m_hTreeView->GetNodeName(selectedNode);
550+
return m_hTreeView->GetNodeName(selectedNode, true);
536551
}
537552
return std::wstring();
538553
}

NppJSONViewer/NppJsonViewer/JsonViewDlg.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class JsonViewDlg : public DockingDlgInterface
2929
void HandleTabActivated();
3030

3131
HTREEITEM InsertToTree(HTREEITEM parent, const std::string &text);
32+
void AppendNodeCount(HTREEITEM node, unsigned elementCount, bool bArray);
3233

3334
private:
3435
void DrawJsonTree();

NppJSONViewer/NppJsonViewer/RapidJsonHandler.cpp

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -129,14 +129,9 @@ bool RapidJsonHandler::StartObject()
129129
return true;
130130
}
131131

132-
bool RapidJsonHandler::EndObject(unsigned /*memberCount*/)
132+
bool RapidJsonHandler::EndObject(unsigned memberCount)
133133
{
134-
if (!m_NodeStack.empty())
135-
{
136-
TreeNode *node = m_NodeStack.top();
137-
m_NodeStack.pop();
138-
delete node;
139-
}
134+
AppendNodeCount(memberCount, false);
140135
return true;
141136
}
142137

@@ -182,14 +177,9 @@ bool RapidJsonHandler::StartArray()
182177
return true;
183178
}
184179

185-
bool RapidJsonHandler::EndArray(unsigned /*elementCount*/)
180+
bool RapidJsonHandler::EndArray(unsigned elementCount)
186181
{
187-
if (!m_NodeStack.empty())
188-
{
189-
TreeNode *node = m_NodeStack.top();
190-
m_NodeStack.pop();
191-
delete node;
192-
}
182+
AppendNodeCount(elementCount, true);
193183
return true;
194184
}
195185

@@ -217,3 +207,17 @@ void RapidJsonHandler::InsertToTree(TreeNode *node, const char *const str, bool
217207
else
218208
m_dlg->InsertToTree(node->subRoot, node->node.key + " : " + node->node.value);
219209
}
210+
211+
void RapidJsonHandler::AppendNodeCount(unsigned elementCount, bool bArray)
212+
{
213+
if (!m_NodeStack.empty())
214+
{
215+
TreeNode *node = m_NodeStack.top();
216+
m_NodeStack.pop();
217+
218+
if (node->subRoot && node->subRoot != m_treeRoot)
219+
m_dlg->AppendNodeCount(node->subRoot, elementCount, bArray);
220+
221+
delete node;
222+
}
223+
}

NppJSONViewer/NppJsonViewer/RapidJsonHandler.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,5 @@ class RapidJsonHandler : public rapidjson::BaseReaderHandler<rapidjson::UTF8<>,
4949

5050
private:
5151
void InsertToTree(TreeNode *node, const char *const str, bool bQuote);
52+
void AppendNodeCount(unsigned elementCount, bool bArray);
5253
};

NppJSONViewer/NppJsonViewer/TreeViewCtrl.cpp

Lines changed: 57 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#include "Define.h"
33
#include "resource.h"
44
#include "StringHelper.h"
5+
#include <memory>
56

67

78
void 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+
4660
bool 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

148194
auto 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

160206
auto 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+
}

NppJSONViewer/NppJsonViewer/TreeViewCtrl.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class TreeViewCtrl
2121

2222
auto InitTree() -> HTREEITEM;
2323
auto InsertNode(const std::wstring &text, LPARAM lparam, HTREEITEM parentNode) -> HTREEITEM;
24+
void UpdateNodeText(HTREEITEM node, const std::wstring &text);
2425

2526
bool IsExpanded(HTREEITEM node) const;
2627
bool IsThisOrAnyChildExpanded(HTREEITEM node) const;
@@ -48,7 +49,7 @@ class TreeViewCtrl
4849

4950
HTREEITEM NextItem(HTREEITEM htiCurrent, HTREEITEM htiNextRoot);
5051

51-
auto GetNodeName(HTREEITEM hti) -> std::wstring;
52+
auto GetNodeName(HTREEITEM hti, bool removeTrailingCount) -> std::wstring;
5253
auto GetNodeKey(HTREEITEM hti) -> std::wstring;
5354
auto GetNodeValue(HTREEITEM hti) -> std::wstring;
5455
auto GetNodePath(HTREEITEM hti) -> std::wstring;
@@ -58,5 +59,6 @@ class TreeViewCtrl
5859

5960
HTREEITEM GetParentItem(HTREEITEM hti);
6061

61-
bool GetTVItem(HTREEITEM hti, TCHAR *buf, int bufSize, TVITEM *tvi);
62+
bool GetTVItem(HTREEITEM hti, TVITEM *tvi) const;
63+
bool SetTVItem(TVITEM *tvi) const;
6264
};

0 commit comments

Comments
 (0)