From ecf44bd085a9d9cb222b5581165e4a6af2384e46 Mon Sep 17 00:00:00 2001 From: mere-human <9664141+mere-human@users.noreply.github.com> Date: Wed, 25 Nov 2020 21:16:01 +0200 Subject: [PATCH] Folder as Workspace: Change folder images after "Expand/Collapse All" Folder images are changed in FileBrowser::notified() when TVN_ITEMEXPANDED is recieved. This works fine when e.g. expand/collapse using "+" button. However, when foldAll() or expandAll() are called on a TreeView, the TVN_ITEMEXPANDED is not sent. The reason is that TVIS_EXPANDEDONCE flag is set. To reset that flag, it would be needed to pass TVE_COLLAPSERESET to TreeView_Expand that also removes all child items which is unwanted. Resolve the problem by notifying TreeView parent manually when recieve TVM_EXPAND and TVIS_EXPANDEDONCE is set. Fix #8912 --- .../src/WinControls/TreeView/TreeView.cpp | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/PowerEditor/src/WinControls/TreeView/TreeView.cpp b/PowerEditor/src/WinControls/TreeView/TreeView.cpp index bae6f57a..4c64729d 100644 --- a/PowerEditor/src/WinControls/TreeView/TreeView.cpp +++ b/PowerEditor/src/WinControls/TreeView/TreeView.cpp @@ -66,6 +66,36 @@ void TreeView::destroy() LRESULT TreeView::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { + if (Message == TVM_EXPAND) + { + if (wParam & (TVE_COLLAPSE | TVE_EXPAND)) + { + // If TVIS_EXPANDEDONCE flag is set, TVM_EXPAND messages do not generate + // TVN_ITEMEXPANDING or TVN_ITEMEXPANDED notifications. + // To reset the flag, you must send a TVM_EXPAND message + // with the TVE_COLLAPSE and TVE_COLLAPSERESET flags set. + // That in turn removes child items which is unwanted. + // Below is a workaround for that. + TVITEM tvItem = {}; + tvItem.hItem = reinterpret_cast(lParam); + tvItem.mask = TVIF_STATE | TVIF_HANDLE | TVIF_PARAM; + tvItem.stateMask = TVIS_EXPANDEDONCE; + TreeView_GetItem(_hSelf, &tvItem); + // Check if a flag is set. + if (tvItem.state & TVIS_EXPANDEDONCE) + { + // If the flag is set, then manually notify parent that an item is collapsed/expanded + // so that it can change icon, etc. + NMTREEVIEW nmtv = {}; + nmtv.hdr.code = TVN_ITEMEXPANDED; + nmtv.hdr.hwndFrom = _hSelf; + nmtv.hdr.idFrom = 0; + nmtv.action = wParam & TVE_COLLAPSE ? TVE_COLLAPSE : TVE_EXPAND; + nmtv.itemNew.hItem = tvItem.hItem; + ::SendMessage(_hParent, WM_NOTIFY, nmtv.hdr.idFrom, reinterpret_cast(&nmtv)); + } + } + } return ::CallWindowProc(_defaultProc, hwnd, Message, wParam, lParam); }