ReactOS 0.4.16-dev-980-g00983aa
brfolder.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS shell32
3 * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
4 * PURPOSE: SHBrowseForFolderA/W functions
5 * COPYRIGHT: Copyright 1999 Juergen Schmied
6 * Copyright 2024 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
7 */
8
9// FIXME: Many flags unimplemented
10
11#include "precomp.h"
12
13#include <ui/layout.h> // Resizable window
14#include <compat_undoc.h> // RosGetProcessEffectiveVersion
15
17
19
20#define SHV_CHANGE_NOTIFY (WM_USER + 0x1111)
21enum { SHGDN_TREE = SHGDN_NORMAL | SHGDN_INFOLDER };
22
23static LPITEMIDLIST
25{
26 SIZE_T cb = 0;
27 for (LPCITEMIDLIST pidl = pidlSrc; pidl && depth--; pidl = ILGetNext(pidl))
28 cb += pidl->mkid.cb;
29
30 LPITEMIDLIST pidlOut = (LPITEMIDLIST)SHAlloc(cb + sizeof(WORD));
31 if (pidlOut)
32 {
33 CopyMemory(pidlOut, pidlSrc, cb);
34 ZeroMemory(((BYTE*)pidlOut) + cb, sizeof(WORD));
35 }
36 return pidlOut;
37}
38
40{
45 LAYOUT_DATA* layout; // Filled by LayoutInit, used by LayoutUpdate
47 ULONG hChangeNotify; // Change notification handle
48 IContextMenu* pContextMenu; // Active context menu
49};
50
52{
53 CComPtr<IShellFolder> lpsfParent; // IShellFolder of the parent
54 PCIDLIST_RELATIVE pidlChild; // PIDL relative to parent
56};
57
58static const LAYOUT_INFO g_layout_info[] =
59{
65 { IDOK, BF_BOTTOM | BF_RIGHT },
67};
68
69#define SUPPORTED_FLAGS (BIF_STATUSTEXT | BIF_BROWSEFORCOMPUTER | BIF_RETURNFSANCESTORS | \
70 BIF_RETURNONLYFSDIRS | BIF_NONEWFOLDERBUTTON | BIF_NEWDIALOGSTYLE | \
71 BIF_BROWSEINCLUDEFILES)
72
73static HTREEITEM
77 _In_ PCUITEMID_CHILD pidlChild,
78 _In_ PCIDLIST_ABSOLUTE pidlParent,
79 _In_ HTREEITEM hParent);
80
81static inline DWORD
83{
84 return SHCONTF_FOLDERS | ((ulFlags & BIF_BROWSEINCLUDEFILES) ? SHCONTF_NONFOLDERS : 0);
85}
86
87static void
89{
90 if (!lpBrowseInfo->lpfn)
91 return;
92 lpBrowseInfo->lpfn(hWnd, uMsg, lParam, lpBrowseInfo->lParam);
93}
94
95static BrItemData *
97{
99 item.hItem = hItem;
100 if (!TreeView_GetItem(info->hwndTreeView, &item))
101 {
102 ERR("TreeView_GetItem failed\n");
103 return NULL;
104 }
105 return (BrItemData *)item.lParam;
106}
107
108static SFGAOF
110{
112 SFGAOF Att = Query;
113 HRESULT hr = item ? item->lpsfParent->GetAttributesOf(1, &item->pidlChild, &Att) : E_FAIL;
114 return SUCCEEDED(hr) ? (Query & Att) : 0;
115}
116
117static HRESULT
120 _In_ BrItemData *pItemData,
121 _Outptr_opt_ IEnumIDList **ppEnum)
122{
123 if (!pItemData)
124 return E_FAIL;
125
126 CComPtr<IEnumIDList> pEnumIL;
127 PCUITEMID_CHILD pidlRef = pItemData->pidlChild;
128 ULONG attrs = SFGAO_HASSUBFOLDER | SFGAO_FOLDER;
129 IShellFolder *lpsf = pItemData->lpsfParent;
130 HRESULT hr = lpsf->GetAttributesOf(1, &pidlRef, &attrs);
131 if (FAILED_UNEXPECTEDLY(hr) || !(attrs & SFGAO_FOLDER))
132 return E_FAIL;
133
134 CComPtr<IShellFolder> psfChild;
135 if (_ILIsDesktop(pItemData->pidlFull))
136 hr = SHGetDesktopFolder(&psfChild);
137 else
138 hr = lpsf->BindToObject(pidlRef, NULL, IID_PPV_ARG(IShellFolder, &psfChild));
140 return E_FAIL;
141
142 DWORD flags = BrowseFlagsToSHCONTF(info->lpBrowseInfo->ulFlags);
143 hr = psfChild->EnumObjects(info->hWnd, flags, &pEnumIL);
144 if (hr == S_OK)
145 {
146 if ((pEnumIL->Skip(1) != S_OK) || FAILED(pEnumIL->Reset()))
147 pEnumIL = NULL;
148 }
149
150 if (!pEnumIL || !(attrs & SFGAO_HASSUBFOLDER))
151 return E_FAIL; // No children
152
153 if (ppEnum)
154 *ppEnum = pEnumIL.Detach();
155
156 return S_OK; // There are children
157}
158
159/******************************************************************************
160 * BrFolder_InitTreeView [Internal]
161 *
162 * Called from WM_INITDIALOG handler.
163 */
164static void
166{
167 HIMAGELIST hImageList;
168 HRESULT hr;
170
171 Shell_GetImageLists(NULL, &hImageList);
172 if (hImageList)
173 TreeView_SetImageList(info->hwndTreeView, hImageList, 0);
174
175 /* We want to call BrFolder_InsertItem down the code, in order to insert
176 * the root item of the treeview. Due to BrFolder_InsertItem's signature,
177 * we need the following to do this:
178 *
179 * + An ITEMIDLIST corresponding to _the parent_ of root.
180 * + An ITEMIDLIST, which is a relative path from root's parent to root
181 * (containing a single SHITEMID).
182 * + An IShellFolder interface pointer of root's parent folder.
183 *
184 * If root is 'Desktop', then root's parent is also 'Desktop'.
185 */
186
187 PCIDLIST_ABSOLUTE pidlRoot = info->lpBrowseInfo->pidlRoot;
188 CComHeapPtr<ITEMIDLIST_ABSOLUTE> pidlParent(ILClone(pidlRoot));
189 ILRemoveLastID(pidlParent);
190 PCIDLIST_RELATIVE pidlChild = ILFindLastID(pidlRoot);
191
192 CComPtr<IShellFolder> lpsfParent;
193 hr = SHBindToObject(NULL, pidlParent, /*NULL, */ IID_PPV_ARG(IShellFolder, &lpsfParent));
195 return;
196
197 TreeView_DeleteItem(info->hwndTreeView, TVI_ROOT);
198 hItem = BrFolder_InsertItem(info, lpsfParent, pidlChild, pidlParent, TVI_ROOT);
199 TreeView_Expand(info->hwndTreeView, hItem, TVE_EXPAND);
200}
201
202static HRESULT
204{
205 INT open = -1;
206 INT normal = SHMapPIDLToSystemImageListIndex(item.lpsfParent, item.pidlChild, &open);
207 if (normal >= 0)
208 {
209 tvi.iImage = normal;
210 tvi.iSelectedImage = (open >= 0) ? open : normal;
211 return S_OK;
212 }
214 return S_FALSE;
215}
216
217/******************************************************************************
218 * BrFolder_GetName [Internal]
219 *
220 * Query a shell folder for the display name of one of its children
221 *
222 * PARAMS
223 * lpsf [I] IShellFolder interface of the folder to be queried.
224 * pidlChild [I] ITEMIDLIST of the child, relative to parent
225 * dwFlags [I] as in IShellFolder::GetDisplayNameOf
226 * lpFriendlyName [O] The desired display name in unicode
227 *
228 * RETURNS
229 * Success: TRUE
230 * Failure: FALSE
231 */
232static BOOL
234 _In_ IShellFolder *lpsf,
235 _In_ PCIDLIST_RELATIVE pidlChild,
237 _Out_ PWSTR lpFriendlyName)
238{
239 BOOL bSuccess = FALSE;
240 STRRET str;
241
242 TRACE("%p %p %x %p\n", lpsf, pidlChild, dwFlags, lpFriendlyName);
243 if (!FAILED_UNEXPECTEDLY(lpsf->GetDisplayNameOf(pidlChild, dwFlags, &str)))
244 bSuccess = StrRetToStrNW(lpFriendlyName, MAX_PATH, &str, pidlChild);
245
246 TRACE("-- %s\n", debugstr_w(lpFriendlyName));
247 return bSuccess;
248}
249
250static BOOL
256{
258 return BrFolder_GetName(item->lpsfParent, item->pidlChild, Flags, Buffer);
259 return FALSE;
260}
261
262static BOOL
266 _Inout_ IEnumIDList *pEnum)
267{
269 if (!pItemData)
270 return FALSE;
271
272 pEnum->Reset();
273
275 while (pEnum->Next(1, &pidlTemp, NULL) == S_OK)
276 {
277 if (ILIsEqual(pidlTemp, pItemData->pidlChild))
278 return TRUE;
279
280 pidlTemp.Free();
281 }
282
283 return FALSE;
284}
285
286static BOOL
290 _Outptr_opt_ PITEMID_CHILD pidlChild)
291{
292 for (hItem = TreeView_GetChild(info->hwndTreeView, hItem); hItem;
293 hItem = TreeView_GetNextSibling(info->hwndTreeView, hItem))
294 {
296 if (ILIsEqual(pItemData->pidlChild, pidlChild))
297 return TRUE;
298 }
299
300 return FALSE;
301}
302
303static HTREEITEM
308{
309 if (!hItem)
310 hItem = TreeView_GetRoot(info.hwndTreeView);
311
312 for (; pidl && hItem; hItem = TreeView_GetNextSibling(info.hwndTreeView, hItem))
313 {
315 if (ILIsEqual(pItemData->pidlFull, pidl))
316 return hItem;
319 return hChild;
320 }
321 return NULL;
322}
323
324static BOOL
330{
331 ASSERT(hItem);
334 if (!data)
335 return FALSE;
336
337 if (pidlFull)
338 {
339 if ((pidlFull = ILClone(pidlFull)) == NULL)
340 return FALSE;
341 data->pidlFull.Free();
342 data->pidlFull.Attach(const_cast<PIDLIST_ABSOLUTE>(pidlFull));
343 data->pidlChild = ILFindLastID(data->pidlFull);
344 // Note: We assume lpsfParent does not change
345 }
346
348 if (Flags & TVIF_TEXT)
349 {
350 item.pszText = Name;
351 if (!BrFolder_GetName(data->lpsfParent, data->pidlChild, SHGDN_TREE, Name))
352 return FALSE;
353 }
354
355 if (Flags & TVIF_IMAGE)
356 {
357 item.mask |= TVIF_SELECTEDIMAGE;
359 }
360
361 item.cChildren = 0;
363 if ((Flags & TVIF_CHILDREN) && BrFolder_GetChildrenEnum(&info, data, &pEnum) == S_OK)
364 {
366 if (pEnum->Next(1, &pidlTemp, NULL) == S_OK)
367 ++item.cChildren;
368 }
369
370 return TreeView_SetItem(info.hwndTreeView, &item);
371}
372
373static void
377{
379}
380
381/******************************************************************************
382 * BrFolder_InsertItem [Internal]
383 *
384 * PARAMS
385 * info [I] data for the dialog
386 * lpsf [I] IShellFolder interface of the item's parent shell folder
387 * pidlChild [I] ITEMIDLIST of the child to insert, relative to parent
388 * pidlParent [I] ITEMIDLIST of the parent shell folder
389 * hParent [I] The treeview-item that represents the parent shell folder
390 *
391 * RETURNS
392 * Success: Handle to the created and inserted treeview-item
393 * Failure: NULL
394 */
395static HTREEITEM
398 _Inout_ IShellFolder *lpsf,
399 _In_ PCUITEMID_CHILD pidlChild,
400 _In_ PCIDLIST_ABSOLUTE pidlParent,
401 _In_ HTREEITEM hParent)
402{
403 if (!(BrowseFlagsToSHCONTF(info->lpBrowseInfo->ulFlags) & SHCONTF_NONFOLDERS))
404 {
405#ifdef BIF_BROWSEFILEJUNCTIONS
406 if (!(info->lpBrowseInfo->ulFlags & BIF_BROWSEFILEJUNCTIONS))
407#endif
408 if (SHGetAttributes(lpsf, pidlChild, SFGAO_STREAM) & SFGAO_STREAM)
409 return NULL; // .zip files have both FOLDER and STREAM attributes set
410 }
411
413 if (!BrFolder_GetName(lpsf, pidlChild, SHGDN_TREE, szName))
414 return NULL;
415
416 BrItemData *pItemData = new BrItemData();
417
419 item.pszText = szName;
420 item.cchTextMax = _countof(szName);
421 item.lParam = (LPARAM)pItemData;
422
423 PIDLIST_ABSOLUTE pidlFull =
424 (pidlParent ? ILCombine(pidlParent, pidlChild) : ILClone(pidlChild));
425
426 pItemData->lpsfParent = lpsf;
427 pItemData->pidlFull.Attach(pidlFull);
428 pItemData->pidlChild = ILFindLastID(pItemData->pidlFull);
429 BrFolder_GetIconPair(*pItemData, item);
430
431 if (BrFolder_GetChildrenEnum(info, pItemData, NULL) == S_OK)
432 item.cChildren = 1;
433
434 TVINSERTSTRUCTW tvins = { hParent };
435 tvins.item = item;
436 return TreeView_InsertItem(info->hwndTreeView, &tvins);
437}
438
439/******************************************************************************
440 * BrFolder_Expand [Internal]
441 *
442 * For each child (given by pEnum) of the parent shell folder, which is given by
443 * lpsf and whose PIDL is pidl, insert a treeview-item right under hParent
444 *
445 * PARAMS
446 * info [I] data for the dialog
447 * lpsf [I] IShellFolder interface of the parent shell folder
448 * pidl [I] ITEMIDLIST of the parent shell folder
449 * hParent [I] The treeview item that represents the parent shell folder
450 * pEnum [I] An iterator for the children of the parent shell folder
451 */
452static void
455 _In_ IShellFolder *lpsf,
456 _In_ PCIDLIST_ABSOLUTE pidlFull,
457 _In_ HTREEITEM hParent)
458{
459 TRACE("%p %p %p\n", lpsf, pidlFull, hParent);
460
461 // No IEnumIDList -> No children
462 BrItemData *pItemData = BrFolder_GetItemData(info, hParent);
464 HRESULT hr = BrFolder_GetChildrenEnum(info, pItemData, &pEnum);
465 if (FAILED(hr))
466 return;
467
468 SetCapture(info->hWnd);
470
472 ULONG ulFetched;
473 while (S_OK == pEnum->Next(1, &pidlTemp, &ulFetched))
474 {
475 /* Ignore return value of BrFolder_InsertItem to avoid incomplete folder listing */
476 BrFolder_InsertItem(info, lpsf, pidlTemp, pidlFull, hParent);
477 pidlTemp.Free(); // Finally, free the pidl that the shell gave us...
478 }
479
482}
483
484static inline BOOL
486{
488 if (!data)
489 return FALSE;
490 return (data->type == type);
491}
492
493static void
495{
496 LPBROWSEINFOW lpBrowseInfo = info->lpBrowseInfo;
497 PCIDLIST_RELATIVE pidlChild = pItemData->pidlChild;
499 HRESULT hr;
500
501 BOOL bEnabled = TRUE;
502 if ((lpBrowseInfo->ulFlags & BIF_BROWSEFORCOMPUTER) && !PIDLIsType(pidlChild, PT_COMP))
503 bEnabled = FALSE;
504
505 if (lpBrowseInfo->ulFlags & BIF_RETURNFSANCESTORS)
506 {
507 dwAttributes = SFGAO_FILESYSANCESTOR | SFGAO_FILESYSTEM;
508 hr = pItemData->lpsfParent->GetAttributesOf(1, &pidlChild, &dwAttributes);
509 if (FAILED(hr) || !(dwAttributes & (SFGAO_FILESYSANCESTOR | SFGAO_FILESYSTEM)))
510 bEnabled = FALSE;
511 }
512
513 dwAttributes = SFGAO_FOLDER | SFGAO_FILESYSTEM;
514 hr = pItemData->lpsfParent->GetAttributesOf(1, &pidlChild, &dwAttributes);
515 if (FAILED_UNEXPECTEDLY(hr) ||
516 ((dwAttributes & (SFGAO_FOLDER | SFGAO_FILESYSTEM)) != (SFGAO_FOLDER | SFGAO_FILESYSTEM)))
517 {
518 if (lpBrowseInfo->ulFlags & BIF_RETURNONLYFSDIRS)
519 bEnabled = FALSE;
521 }
522 else
523 {
525 }
526
527 SendMessageW(info->hWnd, BFFM_ENABLEOK, 0, bEnabled);
528}
529
530static LRESULT
532{
533 BrItemData *pItemData = (BrItemData *)pnmtv->itemOld.lParam;
534
535 TRACE("TVN_DELETEITEMA/W %p\n", pItemData);
536
537 delete pItemData;
538 return 0;
539}
540
541static LRESULT
543{
544 BrItemData *pItemData = (BrItemData *)pnmtv->itemNew.lParam;
545
546 TRACE("TVN_ITEMEXPANDINGA/W\n");
547
548 if ((pnmtv->itemNew.state & TVIS_EXPANDEDONCE))
549 return 0;
550
551 HRESULT hr = S_OK;
553 if (!_ILIsEmpty(pItemData->pidlChild))
554 {
555 hr = pItemData->lpsfParent->BindToObject(pItemData->pidlChild, NULL,
556 IID_PPV_ARG(IShellFolder, &lpsf2));
557 }
558 else
559 {
560 lpsf2 = pItemData->lpsfParent;
561 }
562
563 HTREEITEM hItem = pnmtv->itemNew.hItem;
565 BrFolder_Expand(info, lpsf2, pItemData->pidlFull, hItem);
566
567 // My Computer is already sorted and trying to do a simple text
568 // sort will only mess things up
569 if (!_ILIsMyComputer(pItemData->pidlChild))
570 TreeView_SortChildren(info->hwndTreeView, hItem, FALSE);
571
572 return 0;
573}
574
575static HRESULT
577{
578 BrItemData *pItemData = (BrItemData *)pnmtv->itemNew.lParam;
579
580 ILFree(info->pidlRet);
581 info->pidlRet = ILClone(pItemData->pidlFull);
582
584 if (BrFolder_GetName(pItemData->lpsfParent, pItemData->pidlChild, SHGDN_NORMAL | SHGDN_INFOLDER, szName))
586
587 BrFolder_Callback(info->lpBrowseInfo, info->hWnd, BFFM_SELCHANGED, (LPARAM)info->pidlRet);
589 return S_OK;
590}
591
592static LRESULT
594{
595 if (!pnmtv->item.pszText)
596 return FALSE;
597
598 HTREEITEM hItem = TreeView_GetSelection(info->hwndTreeView);
600 ASSERT(data);
601 ASSERT(BrFolder_GetItemAttributes(info, hItem, SFGAO_CANRENAME) & SFGAO_CANRENAME);
602
603 PITEMID_CHILD newChild;
604 HRESULT hr = data->lpsfParent->SetNameOf(info->hWnd, data->pidlChild, pnmtv->item.pszText,
605 SHGDN_NORMAL | SHGDN_INFOLDER, &newChild);
606 if (FAILED(hr))
607 return FALSE;
608
609 LPITEMIDLIST newFull;
610 if (SUCCEEDED(hr = SHILClone(data->pidlFull, &newFull)))
611 {
612 ILRemoveLastID(newFull);
613 if (SUCCEEDED(hr = SHILAppend(newChild, &newFull)))
614 {
615 data->pidlFull.Free();
616 data->pidlFull.Attach(newFull);
617 data->pidlChild = ILFindLastID(data->pidlFull);
618 }
619 newChild = NULL; // SHILAppend is nuts and frees this
620 }
621 ILFree(newChild);
622
623 BOOL AllowTreeTextChange = !BrFolder_UpdateItemEx(*info, hItem, NULL, TVIF_TEXT);
624
625 NMTREEVIEWW nmtv;
626 nmtv.itemNew.hItem = hItem;
627 nmtv.itemNew.mask = TVIF_PARAM;
628 nmtv.itemNew.lParam = (LPARAM)data;
630 return AllowTreeTextChange;
631}
632
633static HRESULT
635{
636 TreeView_SelectItem(info->hwndTreeView, hItem);
637 TreeView_EditLabel(info->hwndTreeView, hItem);
638 return S_OK;
639}
640
641static void
643{
645 if (!data || !BrFolder_GetItemAttributes(info, hItem, SFGAO_CANDELETE))
646 return;
648 if (FAILED(data->lpsfParent->GetUIObjectOf(info->hWnd, 1, &data->pidlChild, IID_NULL_PPV_ARG(IContextMenu, &pCM))))
649 return;
650 UINT fCMIC = 0;
651 if (GetKeyState(VK_SHIFT) < 0)
652 fCMIC |= CMIC_MASK_SHIFT_DOWN;
653 if (GetKeyState(VK_CONTROL) < 0)
654 fCMIC |= CMIC_MASK_CONTROL_DOWN;
655 SHInvokeCommandOnContextMenu(info->hWnd, NULL, pCM, fCMIC, "delete");
656}
657
658static void
660
661static LRESULT
663{
664 // Old dialog doesn't support those advanced features
665 if (!(info->lpBrowseInfo->ulFlags & BIF_USENEWUI))
666 return 0;
667
668 HTREEITEM hItem = TreeView_GetSelection(info->hwndTreeView);
669
670 switch (keydown->wVKey)
671 {
672 case VK_F2:
674 break;
675 case VK_DELETE:
677 break;
678 case 'R':
679 {
680 if (GetKeyState(VK_CONTROL) < 0) // Ctrl+R
682 break;
683 }
684 case VK_F5:
685 {
687 break;
688 }
689 }
690 return 0;
691}
692
693static LRESULT
695{
696 NMTREEVIEWW *pnmtv = (NMTREEVIEWW *)lpnmh;
697
698 TRACE("%p %x %p msg=%x\n", info, CtlID, lpnmh, pnmtv->hdr.code);
699
701 return 0;
702
703 switch (pnmtv->hdr.code)
704 {
705 case TVN_DELETEITEMA:
706 case TVN_DELETEITEMW:
707 return BrFolder_Treeview_Delete(info, pnmtv);
708
711 return BrFolder_Treeview_Expand(info, pnmtv);
712
713 case TVN_SELCHANGEDA:
714 case TVN_SELCHANGEDW:
715 return BrFolder_Treeview_Changed(info, pnmtv);
716
719 {
720 HWND hWndEdit = TreeView_GetEditControl(lpnmh->hwndFrom);
721 NMTVDISPINFO &tvdi = *(NMTVDISPINFO*)lpnmh;
722 UINT att = BrFolder_GetItemAttributes(info, tvdi.item.hItem, SFGAO_CANRENAME);
723 if (!(att & SFGAO_CANRENAME))
724 {
725 MessageBeep(0xffffffff);
726 return S_FALSE;
727 }
729 if (BrFolder_GetName(info, tvdi.item.hItem, SHGDN_INFOLDER | SHGDN_FOREDITING, Name))
730 SetWindowTextW(hWndEdit, Name);
731 return S_OK;
732 }
733
736
737 case TVN_KEYDOWN:
739
740 default:
741 WARN("unhandled (%d)\n", pnmtv->hdr.code);
742 break;
743 }
744
745 return 0;
746}
747
748static BOOL
750{
753 LPBROWSEINFOW lpBrowseInfo = info->lpBrowseInfo;
754
755 info->hWnd = hWnd;
757
758 if (lpBrowseInfo->ulFlags & BIF_NEWDIALOGSTYLE)
759 FIXME("flags BIF_NEWDIALOGSTYLE partially implemented\n");
760
761 if (lpBrowseInfo->ulFlags & ~SUPPORTED_FLAGS)
762 FIXME("flags %x not implemented\n", (lpBrowseInfo->ulFlags & ~SUPPORTED_FLAGS));
763
764 info->layout = NULL;
765 if (lpBrowseInfo->ulFlags & BIF_USENEWUI)
766 {
767 RECT rcWnd;
768
769 // Resize the treeview if there's not editbox
770 if ((lpBrowseInfo->ulFlags & BIF_NEWDIALOGSTYLE) &&
771 !(lpBrowseInfo->ulFlags & BIF_EDITBOX))
772 {
773 RECT rcEdit, rcTreeView;
776 LONG cy = rcTreeView.top - rcEdit.top;
777 MapWindowPoints(NULL, hWnd, (LPPOINT)&rcTreeView, sizeof(RECT) / sizeof(POINT));
778 rcTreeView.top -= cy;
780 rcTreeView.left, rcTreeView.top,
781 rcTreeView.right - rcTreeView.left,
782 rcTreeView.bottom - rcTreeView.top, TRUE);
783 }
784
785 if (lpBrowseInfo->ulFlags & BIF_NEWDIALOGSTYLE)
787
788 // TODO: Windows allows shrinking the windows a bit
789 GetWindowRect(hWnd, &rcWnd);
790 info->szMin.cx = rcWnd.right - rcWnd.left;
791 info->szMin.cy = rcWnd.bottom - rcWnd.top;
792 }
793
794 if (lpBrowseInfo->lpszTitle)
796 else
798
799 if (!(lpBrowseInfo->ulFlags & BIF_STATUSTEXT) || (lpBrowseInfo->ulFlags & BIF_USENEWUI))
801
802 // Hide "Make New Folder" Button?
803 if ((lpBrowseInfo->ulFlags & BIF_NONEWFOLDERBUTTON) ||
804 !(lpBrowseInfo->ulFlags & BIF_NEWDIALOGSTYLE))
805 {
807 }
808
809 // Hide the editbox?
810 if (!(lpBrowseInfo->ulFlags & BIF_EDITBOX))
811 {
814 }
815
817 if (info->hwndTreeView)
819 else
820 ERR("treeview control missing!\n");
821
822 // Register for change notifications
823 SHGetFolderLocation(NULL, CSIDL_DESKTOP, NULL, 0, &pidlDesktop);
824
825 ntreg.pidl = pidlDesktop;
826 ntreg.fRecursive = TRUE;
827 info->hChangeNotify = SHChangeNotifyRegister(hWnd,
830 SHV_CHANGE_NOTIFY, 1, &ntreg);
831
832 if (!lpBrowseInfo->pidlRoot)
833 {
834 UINT csidl = (lpBrowseInfo->ulFlags & BIF_NEWDIALOGSTYLE) ? CSIDL_PERSONAL : CSIDL_DRIVES;
836 if (pidl)
837 {
839 if (csidl == CSIDL_DRIVES)
841 ILFree(pidl);
842 }
843 }
844
845 BrFolder_Callback(info->lpBrowseInfo, hWnd, BFFM_INITIALIZED, 0);
846
849 return TRUE;
850}
851
852static HRESULT
854{
855 CComPtr<IShellFolder> desktop, cur;
856 WCHAR wszNewFolder[25], path[MAX_PATH], name[MAX_PATH];
857
858 HRESULT hr = SHGetDesktopFolder(&desktop);
860 return hr;
861
862 if (info->pidlRet)
863 {
864 hr = desktop->BindToObject(info->pidlRet, NULL, IID_PPV_ARG(IShellFolder, &cur));
866 return hr;
867
868 hr = SHGetPathFromIDListW(info->pidlRet, path);
869 }
870 else
871 {
872 cur = desktop;
874 }
875
877 return hr;
878
879 hr = E_FAIL;
880 if (!LoadStringW(shell32_hInstance, IDS_NEWFOLDER, wszNewFolder, _countof(wszNewFolder)))
881 return hr;
882
883 if (!PathYetAnotherMakeUniqueName(name, path, NULL, wszNewFolder))
884 return hr;
885
886 INT len = lstrlenW(path);
887 if (len < MAX_PATH && name[len] == L'\\')
888 len++;
889
891 return hr;
892
893 // Update parent of newly created directory
894 HTREEITEM hParent = TreeView_GetSelection(info->hwndTreeView);
895 if (!hParent)
896 return hr;
897
898 TreeView_Expand(info->hwndTreeView, hParent, TVE_EXPAND);
899
901 item.hItem = hParent;
902 TreeView_GetItem(info->hwndTreeView, &item);
903 BrItemData *item_data = (BrItemData *)item.lParam;
904 if (!item_data)
905 return hr;
906
907 // Update treeview
908 if (!(item.state & TVIS_EXPANDEDONCE))
909 {
910 item.mask = TVIF_STATE;
911 item.state = item.stateMask = TVIS_EXPANDEDONCE;
912 TreeView_SetItem(info->hwndTreeView, &item);
913 }
914
916 hr = cur->ParseDisplayName(NULL, NULL, name + len, NULL, &pidlNew, NULL);
918 return hr;
919
920 HTREEITEM hAdded = BrFolder_InsertItem(info, cur, pidlNew, item_data->pidlFull, hParent);
921 TreeView_SortChildren(info->hwndTreeView, hParent, FALSE);
922 return BrFolder_Rename(info, hAdded);
923}
924
925static void
927{
928 // Get the text
931 StrTrimW(szPath, L" \t");
932
933 // The original pidl is owned by the treeview and will be free'd.
935 info->pidlRet = ILCreateFromPathW(szPath); // It's valid path
936 else
937 info->pidlRet = ILClone(info->pidlRet);
938
939 if (!info->pidlRet) // A null pidl would mean a cancel
940 info->pidlRet = _ILCreateDesktop();
941
942 pdump(info->pidlRet);
943
944 LPBROWSEINFOW lpBrowseInfo = info->lpBrowseInfo;
945 if (!lpBrowseInfo->pszDisplayName)
946 return;
947
948 SHFILEINFOW fileInfo = { NULL };
949 lpBrowseInfo->pszDisplayName[0] = UNICODE_NULL;
950 if (SHGetFileInfoW((LPCWSTR)info->pidlRet, 0, &fileInfo, sizeof(fileInfo),
952 {
953 lstrcpynW(lpBrowseInfo->pszDisplayName, fileInfo.szDisplayName, MAX_PATH);
954 }
955}
956
957static void
959{
960 switch (id)
961 {
962 case IDOK:
963 {
965 EndDialog(info->hWnd, IDOK);
966 break;
967 }
968 case IDCANCEL:
969 {
970 EndDialog(info->hWnd, IDCANCEL);
971 break;
972 }
974 {
976 break;
977 }
978 }
979}
980
981static void
983{
984 RECT rc;
986 {
987 ppt->x = (rc.left + rc.right) / 2;
988 ppt->y = (rc.top + rc.bottom) / 2;
989 }
990 ClientToScreen(hWnd, ppt);
991}
992
993static void
995{
996 enum { IDC_TOGGLE = 1, ID_FIRSTCMD, ID_LASTCMD = 0xffff };
997 HTREEITEM hSelected = TreeView_GetSelection(info.hwndTreeView);
998 CMINVOKECOMMANDINFOEX ici = { sizeof(ici), CMIC_MASK_PTINVOKE, info.hWnd };
999 ici.nShow = SW_SHOW;
1000 ici.ptInvoke.x = GET_X_LPARAM(lParam);
1001 ici.ptInvoke.y = GET_Y_LPARAM(lParam);
1002 if ((int)lParam == -1) // Keyboard
1003 {
1004 GetTreeViewItemContextMenuPos(info.hwndTreeView, hSelected, &ici.ptInvoke);
1005 }
1006 else // Get correct item for right-click on not current item
1007 {
1008 TVHITTESTINFO hti = { ici.ptInvoke };
1009 ScreenToClient(info.hwndTreeView, &hti.pt);
1010 hSelected = TreeView_HitTest(info.hwndTreeView, &hti);
1011 }
1012 BrItemData *item = BrFolder_GetItemData(&info, hSelected);
1013 if (!item)
1014 return; // Not on an item
1015
1016 TV_ITEM tvi;
1017 tvi.mask = TVIF_STATE | TVIF_CHILDREN;
1018 tvi.stateMask = TVIS_EXPANDED;
1019 tvi.hItem = hSelected;
1020 TreeView_GetItem(info.hwndTreeView, &tvi);
1021
1023 HRESULT hr = item->lpsfParent->GetUIObjectOf(info.hWnd, 1, &item->pidlChild,
1024 IID_IContextMenu, NULL, (void**)&pcm);
1025 if (FAILED(hr))
1026 return;
1027
1028 HMENU hMenu = CreatePopupMenu();
1029 if (!hMenu)
1030 return;
1031 info.pContextMenu = pcm;
1032 UINT cmf = ((GetKeyState(VK_SHIFT) < 0) ? CMF_EXTENDEDVERBS : 0) | CMF_CANRENAME;
1033 hr = pcm->QueryContextMenu(hMenu, 0, ID_FIRSTCMD, ID_LASTCMD, CMF_EXPLORE | cmf);
1034 if (hr > 0)
1035 _InsertMenuItemW(hMenu, 0, TRUE, 0, MFT_SEPARATOR, NULL, 0);
1036 _InsertMenuItemW(hMenu, 0, TRUE, IDC_TOGGLE, MFT_STRING,
1038 MFS_DEFAULT | (tvi.cChildren ? 0 : MFS_GRAYED));
1039
1040 UINT cmd = TrackPopupMenuEx(hMenu, TPM_RETURNCMD, ici.ptInvoke.x, ici.ptInvoke.y, info.hWnd, NULL);
1041 ici.lpVerb = MAKEINTRESOURCEA(cmd - ID_FIRSTCMD);
1042 if (cmd == IDC_TOGGLE)
1043 {
1044 TreeView_SelectItem(info.hwndTreeView, hSelected);
1045 TreeView_Expand(info.hwndTreeView, hSelected, TVE_TOGGLE);
1046 }
1047 else if (cmd != 0 && GetDfmCmd(pcm, ici.lpVerb) == DFM_CMD_RENAME)
1048 {
1049 BrFolder_Rename(&info, hSelected);
1050 }
1051 else if (cmd != 0)
1052 {
1053 if (GetKeyState(VK_SHIFT) < 0)
1054 ici.fMask |= CMIC_MASK_SHIFT_DOWN;
1055 if (GetKeyState(VK_CONTROL) < 0)
1056 ici.fMask |= CMIC_MASK_CONTROL_DOWN;
1057 pcm->InvokeCommand((CMINVOKECOMMANDINFO*)&ici);
1058 }
1059 info.pContextMenu = NULL;
1060 DestroyMenu(hMenu);
1061}
1062
1063static BOOL
1065{
1066 LPITEMIDLIST pidlCurrent = pidlSelection;
1067 if (_ILIsDesktop(pidlSelection))
1068 {
1069 if (phItem)
1070 *phItem = TVI_ROOT;
1071 return TRUE;
1072 }
1073
1074 // Initialize item to point to the first child of the root folder.
1076 item.hItem = TreeView_GetRoot(info->hwndTreeView);
1077 if (item.hItem)
1078 item.hItem = TreeView_GetChild(info->hwndTreeView, item.hItem);
1079
1080 // Walk the tree along the nodes corresponding to the remaining ITEMIDLIST
1081 UINT depth = _ILGetDepth(info->lpBrowseInfo->pidlRoot);
1082 while (item.hItem && pidlCurrent)
1083 {
1084 LPITEMIDLIST pidlNeedle = ILCloneToDepth(pidlSelection, ++depth);
1085 if (_ILIsEmpty(pidlNeedle))
1086 {
1087 ILFree(pidlNeedle);
1088 item.hItem = NULL; // Failure
1089 break;
1090 }
1091next:
1092 TreeView_GetItem(info->hwndTreeView, &item);
1093 const BrItemData *pItemData = (BrItemData *)item.lParam;
1094 if (ILIsEqual(pItemData->pidlFull, pidlNeedle))
1095 {
1096 BOOL done = _ILGetDepth(pidlSelection) == _ILGetDepth(pidlNeedle);
1097 if (done)
1098 {
1099 pidlCurrent = NULL; // Success
1100 }
1101 else
1102 {
1103 TreeView_Expand(info->hwndTreeView, item.hItem, TVE_EXPAND);
1104 item.hItem = TreeView_GetChild(info->hwndTreeView, item.hItem);
1105 }
1106 }
1107 else
1108 {
1109 item.hItem = TreeView_GetNextSibling(info->hwndTreeView, item.hItem);
1110 if (item.hItem)
1111 goto next;
1112 }
1113 ILFree(pidlNeedle);
1114 }
1115
1116 if (phItem)
1117 *phItem = item.hItem;
1118
1119 return (_ILIsEmpty(pidlCurrent) && item.hItem);
1120}
1121
1122static BOOL
1124{
1126 HRESULT hr = SHParseDisplayName(pszString, NULL, &pidlSelection, 0, NULL);
1127 return SUCCEEDED(hr) && BrFolder_ExpandToPidl(info, pidlSelection, phItem);
1128}
1129
1130static BOOL
1132{
1134 BOOL ret;
1135 if (pszString)
1137 else
1138 ret = BrFolder_ExpandToPidl(info, pidlSelection, &hItem);
1139
1140 if (ret)
1141 TreeView_Expand(info->hwndTreeView, hItem, TVE_EXPAND);
1142 return ret;
1143}
1144
1145static BOOL
1147{
1148 if (!pidlSelection)
1149 return FALSE;
1150
1152 BOOL ret = BrFolder_ExpandToPidl(info, pidlSelection, &hItem);
1153 if (ret)
1154 TreeView_SelectItem(info->hwndTreeView, hItem);
1155 return ret;
1156}
1157
1158static BOOL
1160{
1161 if (!pszSelection)
1162 return FALSE;
1163
1165 BOOL ret = BrFolder_ExpandToString(info, pszSelection, &hItem);
1166 if (ret)
1167 TreeView_SelectItem(info->hwndTreeView, hItem);
1168 return ret;
1169}
1170
1171static BOOL
1173{
1174 if (!pszSelectionA)
1175 return FALSE;
1176
1177 CComHeapPtr<WCHAR> pszSelectionW;
1178 __SHCloneStrAtoW(&pszSelectionW, pszSelectionA);
1179 if (!pszSelectionW)
1180 return FALSE;
1181
1182 return BrFolder_OnSetSelectionW(info, pszSelectionW);
1183}
1184
1185static void
1187{
1188 if (info->layout)
1189 {
1190 LayoutDestroy(info->layout);
1191 info->layout = NULL;
1192 }
1193
1194 SHChangeNotifyDeregister(info->hChangeNotify);
1195}
1196
1197static void
1200 _In_ HTREEITEM hTarget)
1201{
1202 // Get enum
1204 BrItemData *pItemData = BrFolder_GetItemData(info, hTarget);
1205 HRESULT hrEnum = BrFolder_GetChildrenEnum(info, pItemData, &pEnum);
1206
1207 // Insert new items
1208 if (SUCCEEDED(hrEnum))
1209 {
1211 while (S_OK == pEnum->Next(1, &pidlTemp, NULL))
1212 {
1213 if (!BrFolder_TreeItemHasThisChild(info, hTarget, pidlTemp))
1214 {
1215 BrFolder_InsertItem(info, pItemData->lpsfParent, pidlTemp, pItemData->pidlFull,
1216 hTarget);
1217 }
1218 pidlTemp.Free();
1219 }
1220 }
1221
1222 // Delete zombie items and update items
1223 HTREEITEM hItem, hNextItem;
1224 for (hItem = TreeView_GetChild(info->hwndTreeView, hTarget); hItem; hItem = hNextItem)
1225 {
1226 hNextItem = TreeView_GetNextSibling(info->hwndTreeView, hItem);
1227
1228 if (FAILED(hrEnum) || !BrFolder_IsTreeItemInEnum(info, hItem, pEnum))
1229 {
1230 TreeView_DeleteItem(info->hwndTreeView, hItem);
1231 hNextItem = TreeView_GetChild(info->hwndTreeView, hTarget);
1232 continue;
1233 }
1234
1237 }
1238
1239 if (SUCCEEDED(hrEnum))
1240 TreeView_SortChildren(info->hwndTreeView, hTarget, FALSE);
1241}
1242
1243static void
1245{
1246 HTREEITEM hRoot = TreeView_GetRoot(info->hwndTreeView);
1247
1248 SendMessageW(info->hwndTreeView, WM_SETREDRAW, FALSE, 0);
1249
1251
1252 SendMessageW(info->hwndTreeView, WM_SETREDRAW, TRUE, 0);
1253 InvalidateRect(info->hwndTreeView, NULL, TRUE);
1254}
1255
1256static void
1259 _In_ PCIDLIST_ABSOLUTE pidl1,
1260 _In_ PCIDLIST_ABSOLUTE pidl2,
1261 _In_ LONG event)
1262{
1263 TRACE("(%p)->(%p, %p, 0x%lX)\n", info, pidl1, pidl2, event);
1264
1265 switch (event)
1266 {
1267 case SHCNE_RENAMEFOLDER:
1268 case SHCNE_RENAMEITEM:
1269 case SHCNE_UPDATEITEM:
1270 {
1271 UINT UpdateFlags = (event == SHCNE_UPDATEITEM) ? (TVIF_IMAGE | TVIF_CHILDREN) : (TVIF_TEXT);
1273 {
1274 if (BrFolder_UpdateItemEx(*info, hTI, pidl2, UpdateFlags))
1275 {
1276 if ((hTI = TreeView_GetParent(info->hwndTreeView, hTI)) != NULL)
1277 TreeView_SortChildren(info->hwndTreeView, hTI, FALSE);
1278 return;
1279 }
1280 }
1281 break;
1282 }
1283 }
1284
1285 switch (event)
1286 {
1287 case SHCNE_DRIVEADD:
1288 case SHCNE_MKDIR:
1289 case SHCNE_CREATE:
1290 case SHCNE_DRIVEREMOVED:
1291 case SHCNE_RMDIR:
1292 case SHCNE_DELETE:
1293 case SHCNE_RENAMEFOLDER:
1294 case SHCNE_RENAMEITEM:
1295 case SHCNE_UPDATEDIR:
1296 case SHCNE_UPDATEITEM:
1297 {
1298 // FIXME: Avoid full refresh and optimize for speed. Use pidl0 and pidl1
1300 break;
1301 }
1302 }
1303}
1304
1305// SHV_CHANGE_NOTIFY
1306static void
1308{
1309 // We use SHCNRF_NewDelivery method
1310 HANDLE hChange = (HANDLE)wParam;
1311 DWORD dwProcID = (DWORD)lParam;
1312
1313 PIDLIST_ABSOLUTE *ppidl = NULL;
1314 LONG event;
1315 HANDLE hLock = SHChangeNotification_Lock(hChange, dwProcID, &ppidl, &event);
1316 if (hLock == NULL)
1317 {
1318 ERR("hLock == NULL\n");
1319 return;
1320 }
1321
1322 BrFolder_OnChangeEx(info, ppidl[0], ppidl[1], (event & ~SHCNE_INTERRUPT));
1323
1325}
1326
1327/*************************************************************************
1328 * BrFolderDlgProc32 (not an exported API function)
1329 */
1330static INT_PTR CALLBACK
1332{
1333 if (uMsg == WM_INITDIALOG)
1335
1337 if (!info)
1338 return 0;
1339
1340 if (info->pContextMenu)
1341 {
1343 if (SHForwardContextMenuMsg(info->pContextMenu, uMsg, wParam,
1344 lParam, &result, TRUE) == S_OK)
1345 {
1347 return TRUE;
1348 }
1349 }
1350
1351 switch (uMsg)
1352 {
1353 case WM_NOTIFY:
1355 return TRUE;
1356
1357 case WM_COMMAND:
1359 break;
1360
1361 case WM_CONTEXTMENU:
1362 if (info->hwndTreeView == (HWND)wParam)
1364 break;
1365
1366 case WM_GETMINMAXINFO:
1367 ((LPMINMAXINFO)lParam)->ptMinTrackSize.x = info->szMin.cx;
1368 ((LPMINMAXINFO)lParam)->ptMinTrackSize.y = info->szMin.cy;
1369 break;
1370
1371 case WM_SIZE:
1372 if (info->layout) // New style dialogs
1374 break;
1375
1378 break;
1379
1382 break;
1383
1384 case BFFM_ENABLEOK:
1386 break;
1387
1388 case BFFM_SETOKTEXT: // Unicode only
1390 break;
1391
1392 case BFFM_SETSELECTIONA:
1393 if (wParam) // String
1395 else // PIDL
1397
1398 case BFFM_SETSELECTIONW:
1399 if (wParam) // String
1401 else // PIDL
1403
1404 case BFFM_SETEXPANDED: // Unicode only
1405 if (wParam) // String
1407 else // PIDL
1409
1410 case SHV_CHANGE_NOTIFY:
1412 break;
1413
1414 case WM_DESTROY:
1416 break;
1417 }
1418
1419 return 0;
1420}
1421
1422/*************************************************************************
1423 * SHBrowseForFolderA [SHELL32.@]
1424 * SHBrowseForFolder [SHELL32.@]
1425 */
1429{
1430 BROWSEINFOW bi;
1431 bi.hwndOwner = lpbi->hwndOwner;
1432 bi.pidlRoot = lpbi->pidlRoot;
1433
1435 bi.pszDisplayName = (lpbi->pszDisplayName ? szName : NULL);
1436
1437 CComHeapPtr<WCHAR> pszTitle;
1438 if (lpbi->lpszTitle)
1439 __SHCloneStrAtoW(&pszTitle, lpbi->lpszTitle);
1440 bi.lpszTitle = pszTitle;
1441
1442 bi.ulFlags = lpbi->ulFlags;
1443 bi.lpfn = lpbi->lpfn;
1444 bi.lParam = lpbi->lParam;
1445 bi.iImage = lpbi->iImage;
1447
1448 if (bi.pszDisplayName)
1450
1451 lpbi->iImage = bi.iImage;
1452 return pidl;
1453}
1454
1455/*************************************************************************
1456 * SHBrowseForFolderW [SHELL32.@]
1457 */
1461{
1462 TRACE("%p\n", lpbi);
1463
1464 // MSDN says the caller must initialize COM. We do it anyway in case the caller forgot.
1465 COleInit OleInit;
1466 BrFolder info = { lpbi };
1467
1471 if (ret == IDOK && !(lpbi->ulFlags & BIF_NOTRANSLATETARGETS) &&
1473 {
1474 PIDLIST_ABSOLUTE pidlTarget;
1475 if (SHELL_GetIDListTarget(info.pidlRet, &pidlTarget) == S_OK)
1476 {
1477 ILFree(info.pidlRet);
1478 info.pidlRet = pidlTarget;
1479 }
1480 }
1481 if (ret != IDOK)
1482 {
1483 ILFree(info.pidlRet);
1484 return NULL;
1485 }
1486
1487 return info.pidlRet;
1488}
BOOL _ILIsDesktop(LPCITEMIDLIST pidl)
Definition: CBandSite.h:24
HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
#define shell32_hInstance
#define open
Definition: acwin.h:95
HWND hWnd
Definition: settings.c:17
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
void shell(int argc, const char *argv[])
Definition: cmds.c:1231
#define IDS_COLLAPSE
Definition: resource.h:144
#define IDS_EXPAND
Definition: resource.h:143
#define IDI_SHELL_FOLDER
Definition: treeview.c:21
BOOL Query(LPCTSTR *ServiceArgs, DWORD ArgCount, BOOL bExtended)
Definition: query.c:292
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
#define EXTERN_C
Definition: basetyps.h:12
static HRESULT BrFolder_Rename(BrFolder *info, HTREEITEM hItem)
Definition: brfolder.cpp:634
static SFGAOF BrFolder_GetItemAttributes(BrFolder *info, HTREEITEM hItem, SFGAOF Query)
Definition: brfolder.cpp:109
static void BrFolder_OnContextMenu(BrFolder &info, LPARAM lParam)
Definition: brfolder.cpp:994
static void BrFolder_OnChange(BrFolder *info, WPARAM wParam, LPARAM lParam)
Definition: brfolder.cpp:1307
static LPITEMIDLIST ILCloneToDepth(LPCITEMIDLIST pidlSrc, UINT depth)
Definition: brfolder.cpp:24
static BOOL BrFolder_OnSetSelectionPidl(BrFolder *info, LPITEMIDLIST pidlSelection)
Definition: brfolder.cpp:1146
static void GetTreeViewItemContextMenuPos(HWND hWnd, HTREEITEM hItem, POINT *ppt)
Definition: brfolder.cpp:982
static HTREEITEM BrFolder_FindTreeItemOfAbsoluteItem(_In_ BrFolder &info, _In_ PCIDLIST_ABSOLUTE pidl, _In_opt_ HTREEITEM hItem=NULL)
Definition: brfolder.cpp:304
EXTERN_C LPITEMIDLIST WINAPI SHBrowseForFolderW(LPBROWSEINFOW lpbi)
Definition: brfolder.cpp:1460
static HRESULT BrFolder_NewFolder(BrFolder *info)
Definition: brfolder.cpp:853
static void BrFolder_Callback(LPBROWSEINFOW lpBrowseInfo, HWND hWnd, UINT uMsg, LPARAM lParam)
Definition: brfolder.cpp:88
static BOOL BrFolder_ExpandToPidl(BrFolder *info, LPITEMIDLIST pidlSelection, HTREEITEM *phItem)
Definition: brfolder.cpp:1064
static BOOL BrFolder_OnSetExpanded(BrFolder *info, LPITEMIDLIST pidlSelection, LPWSTR pszString)
Definition: brfolder.cpp:1131
static BOOL BrFolder_OnSetSelectionW(BrFolder *info, LPWSTR pszSelection)
Definition: brfolder.cpp:1159
static INT_PTR CALLBACK BrFolderDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: brfolder.cpp:1331
static const LAYOUT_INFO g_layout_info[]
Definition: brfolder.cpp:58
static void BrFolder_Refresh(_Inout_ BrFolder *info)
Definition: brfolder.cpp:1244
#define SHV_CHANGE_NOTIFY
Definition: brfolder.cpp:20
static LRESULT BrFolder_Treeview_Expand(BrFolder *info, NMTREEVIEWW *pnmtv)
Definition: brfolder.cpp:542
static BOOL BrFolder_IsTreeItemInEnum(_Inout_ BrFolder *info, _In_ HTREEITEM hItem, _Inout_ IEnumIDList *pEnum)
Definition: brfolder.cpp:263
static BOOL PIDLIsType(LPCITEMIDLIST pidl, PIDLTYPE type)
Definition: brfolder.cpp:485
#define SUPPORTED_FLAGS
Definition: brfolder.cpp:69
static BrItemData * BrFolder_GetItemData(BrFolder *info, HTREEITEM hItem)
Definition: brfolder.cpp:96
static BOOL BrFolder_UpdateItemEx(_In_ BrFolder &info, _In_ HTREEITEM hItem, _In_opt_ PCIDLIST_ABSOLUTE pidlFull, _In_ UINT Flags=TVIF_TEXT|TVIF_IMAGE|TVIF_CHILDREN)
Definition: brfolder.cpp:325
static void BrFolder_Delete(BrFolder *info, HTREEITEM hItem)
Definition: brfolder.cpp:642
static void BrFolder_RefreshRecurse(_Inout_ BrFolder *info, _In_ HTREEITEM hTarget)
Definition: brfolder.cpp:1198
static HRESULT BrFolder_GetChildrenEnum(_In_ BrFolder *info, _In_ BrItemData *pItemData, _Outptr_opt_ IEnumIDList **ppEnum)
Definition: brfolder.cpp:118
static HRESULT BrFolder_Treeview_Changed(BrFolder *info, NMTREEVIEWW *pnmtv)
Definition: brfolder.cpp:576
static DWORD BrowseFlagsToSHCONTF(UINT ulFlags)
Definition: brfolder.cpp:82
static LRESULT BrFolder_Treeview_Keydown(BrFolder *info, LPNMTVKEYDOWN keydown)
Definition: brfolder.cpp:662
static HTREEITEM BrFolder_InsertItem(_Inout_ BrFolder *info, _Inout_ IShellFolder *lpsf, _In_ PCUITEMID_CHILD pidlChild, _In_ PCIDLIST_ABSOLUTE pidlParent, _In_ HTREEITEM hParent)
Definition: brfolder.cpp:396
static void BrFolder_OnOK(BrFolder *info)
Definition: brfolder.cpp:926
static BOOL BrFolder_ExpandToString(BrFolder *info, LPWSTR pszString, HTREEITEM *phItem)
Definition: brfolder.cpp:1123
INT WINAPI Shell_GetCachedImageIndexW(LPCWSTR szPath, INT nIndex, UINT Flags)
Definition: iconcache.cpp:831
static LRESULT BrFolder_OnNotify(BrFolder *info, UINT CtlID, LPNMHDR lpnmh)
Definition: brfolder.cpp:694
static void BrFolder_UpdateItem(_In_ BrFolder *info, _In_ HTREEITEM hItem)
Definition: brfolder.cpp:374
static void BrFolder_OnChangeEx(_Inout_ BrFolder *info, _In_ PCIDLIST_ABSOLUTE pidl1, _In_ PCIDLIST_ABSOLUTE pidl2, _In_ LONG event)
Definition: brfolder.cpp:1257
static HRESULT BrFolder_GetIconPair(BrItemData &item, TVITEMW &tvi)
Definition: brfolder.cpp:203
static void BrFolder_InitTreeView(BrFolder *info)
Definition: brfolder.cpp:165
static void BrFolder_CheckValidSelection(BrFolder *info, BrItemData *pItemData)
Definition: brfolder.cpp:494
@ SHGDN_TREE
Definition: brfolder.cpp:21
EXTERN_C LPITEMIDLIST WINAPI SHBrowseForFolderA(LPBROWSEINFOA lpbi)
Definition: brfolder.cpp:1428
static BOOL BrFolder_OnSetSelectionA(BrFolder *info, LPSTR pszSelectionA)
Definition: brfolder.cpp:1172
static BOOL BrFolder_TreeItemHasThisChild(_In_ BrFolder *info, _In_ HTREEITEM hItem, _Outptr_opt_ PITEMID_CHILD pidlChild)
Definition: brfolder.cpp:287
static BOOL BrFolder_OnInitDialog(HWND hWnd, BrFolder *info)
Definition: brfolder.cpp:749
static BOOL BrFolder_GetName(_In_ IShellFolder *lpsf, _In_ PCIDLIST_RELATIVE pidlChild, _In_ DWORD dwFlags, _Out_ PWSTR lpFriendlyName)
Definition: brfolder.cpp:233
static void BrFolder_OnCommand(BrFolder *info, UINT id)
Definition: brfolder.cpp:958
static void BrFolder_Expand(_In_ BrFolder *info, _In_ IShellFolder *lpsf, _In_ PCIDLIST_ABSOLUTE pidlFull, _In_ HTREEITEM hParent)
Definition: brfolder.cpp:453
static LRESULT BrFolder_Treeview_Rename(BrFolder *info, NMTVDISPINFOW *pnmtv)
Definition: brfolder.cpp:593
static LRESULT BrFolder_Treeview_Delete(BrFolder *info, NMTREEVIEWW *pnmtv)
Definition: brfolder.cpp:531
static void BrFolder_OnDestroy(BrFolder *info)
Definition: brfolder.cpp:1186
EXTERN_C HANDLE WINAPI SHChangeNotification_Lock(HANDLE hTicket, DWORD dwOwnerPID, LPITEMIDLIST **lppidls, LPLONG lpwEventId)
EXTERN_C ULONG WINAPI SHChangeNotifyRegister(HWND hwnd, INT fSources, LONG wEventMask, UINT uMsg, INT cItems, SHChangeNotifyEntry *lpItems)
EXTERN_C BOOL WINAPI SHChangeNotification_Unlock(HANDLE hLock)
EXTERN_C BOOL WINAPI SHChangeNotifyDeregister(ULONG hNotify)
T * Detach()
Definition: atlcomcli.h:186
Definition: bufpool.h:45
void Free()
Definition: atlalloc.h:153
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
static UINT RosGetProcessEffectiveVersion(VOID)
Definition: compat_undoc.h:39
#define E_FAIL
Definition: ddrawi.h:102
void pdump(LPCITEMIDLIST pidl)
Definition: debughlp.cpp:322
LPWSTR Name
Definition: desk.c:124
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define MAX_PATH
Definition: compat.h:34
#define CALLBACK
Definition: compat.h:35
#define lstrcpynW
Definition: compat.h:738
#define lstrlenW
Definition: compat.h:750
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:121
BOOL WINAPI CreateDirectoryW(IN LPCWSTR lpPathName, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes)
Definition: dir.c:90
DWORD SHGetAttributes(_In_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_ DWORD dwAttributes)
Definition: utils.cpp:425
EXTERN_C HRESULT SHBindToObject(_In_opt_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_ REFIID riid, _Out_ void **ppvObj)
Definition: utils.cpp:370
UINT GetDfmCmd(_In_ IContextMenu *pCM, _In_ LPCSTR verba)
Definition: utils.cpp:1736
HRESULT SHELL_GetIDListTarget(_In_ LPCITEMIDLIST pidl, _Out_ PIDLIST_ABSOLUTE *ppidl)
Definition: utils.cpp:459
HRESULT SHILAppend(_Inout_ LPITEMIDLIST pidl, _Inout_ LPITEMIDLIST *ppidl)
Definition: utils.cpp:193
HRESULT SHILClone(_In_opt_ LPCITEMIDLIST pidl, _Outptr_ LPITEMIDLIST *ppidl)
Definition: utils.cpp:133
LPVOID WINAPI SHAlloc(SIZE_T len)
Definition: shellole.c:304
HRESULT WINAPI SHGetFolderLocation(HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwReserved, LPITEMIDLIST *ppidl)
Definition: shellpath.c:3301
HRESULT WINAPI SHGetFolderPathW(HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwFlags, LPWSTR pszPath)
Definition: shellpath.c:2740
BOOL WINAPI PathYetAnotherMakeUniqueName(LPWSTR buffer, LPCWSTR path, LPCWSTR shortname, LPCWSTR longname)
Definition: shellpath.c:848
BOOL WINAPI PathIsDirectoryW(LPCWSTR lpszPath)
Definition: path.c:1729
BOOL WINAPI PathIsRelativeW(LPCWSTR lpszPath)
Definition: path.c:1585
INT WINAPI SHUnicodeToAnsi(LPCWSTR lpSrcStr, LPSTR lpDstStr, INT iLen)
Definition: string.c:2797
BOOL WINAPI StrTrimW(LPWSTR lpszStr, LPCWSTR lpszTrim)
Definition: string.c:1883
EXTERN_C HRESULT WINAPI SHInvokeCommandOnContextMenu(_In_opt_ HWND hWnd, _In_opt_ IUnknown *pUnk, _In_ IContextMenu *pCM, _In_ UINT fCMIC, _In_opt_ LPCSTR pszVerb)
Definition: utils.cpp:148
static IShellFolder IShellItem **static IBindCtx LPITEMIDLIST SFGAOF
Definition: ebrowser.c:83
#define IDS_NEWFOLDER
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
unsigned short WORD
Definition: ntddk_ex.h:93
WCHAR swShell32Name[MAX_PATH]
Definition: folders.cpp:22
FxCollectionEntry * cur
GLint GLint GLsizei GLsizei GLsizei depth
Definition: gl.h:1546
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
struct _cl_event * event
Definition: glext.h:7739
GLbitfield flags
Definition: glext.h:7161
GLuint64EXT * result
Definition: glext.h:11304
GLenum GLsizei len
Definition: glext.h:6722
BOOL WINAPI Shell_GetImageLists(HIMAGELIST *lpBigList, HIMAGELIST *lpSmallList)
Definition: iconcache.cpp:689
int WINAPI SHMapPIDLToSystemImageListIndex(IShellFolder *sh, LPCITEMIDLIST pidl, int *pIndex)
Definition: iconcache.cpp:772
HRESULT BindToObject([in] PCUIDLIST_RELATIVE pidl, [in] LPBC pbcReserved, [in] REFIID riid, [out, iid_is(riid)] void **ppvOut)
HRESULT GetAttributesOf([in] UINT cidl, [in, size_is(cidl)] PCUITEMID_CHILD_ARRAY apidl, [in, out] SFGAOF *rgfInOut)
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define debugstr_w
Definition: kernel32.h:32
static __inline LAYOUT_DATA * LayoutInit(HWND hwndParent, const LAYOUT_INFO *pLayouts, INT cLayouts)
Definition: layout.h:207
static __inline void LayoutDestroy(LAYOUT_DATA *pData)
Definition: layout.h:252
static __inline void LayoutUpdate(HWND ignored1, LAYOUT_DATA *pData, LPCVOID ignored2, UINT ignored3)
Definition: layout.h:188
if(dx< 0)
Definition: linetemp.h:194
#define ASSERT(a)
Definition: mode.c:44
LPCWSTR szPath
Definition: env.c:37
static HTREEITEM hRoot
Definition: treeview.c:383
static HTREEITEM hChild
Definition: treeview.c:383
static HMODULE MODULEINFO DWORD cb
Definition: module.c:33
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:63
static ATOM item
Definition: dde.c:856
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
unsigned int UINT
Definition: ndis.h:50
#define _Inout_
Definition: no_sal2.h:162
#define _Outptr_opt_
Definition: no_sal2.h:264
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define _In_opt_
Definition: no_sal2.h:212
#define DWORD
Definition: nt_native.h:44
#define UNICODE_NULL
#define L(x)
Definition: ntvdm.h:50
@ normal
Definition: optimize.h:166
long LONG
Definition: pedump.c:60
LPITEMIDLIST WINAPI SHCloneSpecialIDList(HWND hwndOwner, int nFolder, BOOL fCreate)
Definition: pidl.c:445
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:237
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:1044
LPITEMIDLIST WINAPI ILFindLastID(LPCITEMIDLIST pidl)
Definition: pidl.c:198
HRESULT WINAPI SHParseDisplayName(LPCWSTR pszName, IBindCtx *pbc, LPITEMIDLIST *ppidl, SFGAOF sfgaoIn, SFGAOF *psfgaoOut)
Definition: pidl.c:1506
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:816
LPITEMIDLIST _ILCreateDesktop(void)
Definition: pidl.c:1752
LPPIDLDATA _ILGetDataPointer(LPCITEMIDLIST pidl)
Definition: pidl.c:2236
BOOL WINAPI ILRemoveLastID(LPITEMIDLIST pidl)
Definition: pidl.c:221
BOOL _ILIsMyComputer(LPCITEMIDLIST pidl)
Definition: pidl.c:2062
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
Definition: pidl.c:1454
LPITEMIDLIST WINAPI ILGetNext(LPCITEMIDLIST pidl)
Definition: pidl.c:970
LPITEMIDLIST WINAPI ILCreateFromPathW(LPCWSTR path)
Definition: pidl.c:1101
BOOL WINAPI ILIsEqual(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:582
BYTE PIDLTYPE
Definition: pidl.h:136
#define PT_COMP
Definition: pidl.h:99
UINT _ILGetDepth(LPCITEMIDLIST pidl)
static BOOL _ILIsEmpty(LPCITEMIDLIST pidl)
Definition: pidl.h:262
static const WCHAR szName[]
Definition: powrprof.c:45
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:586
#define TVN_KEYDOWN
Definition: commctrl.h:3718
#define TVIF_TEXT
Definition: commctrl.h:3271
#define TreeView_SelectItem(hwnd, hitem)
Definition: commctrl.h:3486
#define TreeView_Expand(hwnd, hitem, code)
Definition: commctrl.h:3425
#define TreeView_GetChild(hwnd, hitem)
Definition: commctrl.h:3471
#define TVN_ITEMEXPANDINGA
Definition: commctrl.h:3704
#define TreeView_SortChildren(hwnd, hitem, recurse)
Definition: commctrl.h:3547
#define NMTVDISPINFO
Definition: commctrl.h:3680
#define TreeView_GetEditControl(hwnd)
Definition: commctrl.h:3512
#define TVN_BEGINLABELEDITA
Definition: commctrl.h:3714
#define TVIF_IMAGE
Definition: commctrl.h:3272
#define TVIS_EXPANDEDONCE
Definition: commctrl.h:3290
#define TVN_SELCHANGEDW
Definition: commctrl.h:3653
#define TreeView_GetParent(hwnd, hitem)
Definition: commctrl.h:3474
#define TreeView_GetSelection(hwnd)
Definition: commctrl.h:3478
#define TreeView_GetItem(hwnd, pitem)
Definition: commctrl.h:3495
#define TreeView_GetItemRect(hwnd, hitem, prc, code)
Definition: commctrl.h:3434
#define TVE_EXPAND
Definition: commctrl.h:3428
#define TVI_ROOT
Definition: commctrl.h:3373
#define TVE_TOGGLE
Definition: commctrl.h:3429
#define TV_ITEM
Definition: commctrl.h:3305
#define TreeView_GetRoot(hwnd)
Definition: commctrl.h:3480
#define TVN_DELETEITEMA
Definition: commctrl.h:3712
#define TVIF_HANDLE
Definition: commctrl.h:3275
#define TreeView_GetNextSibling(hwnd, hitem)
Definition: commctrl.h:3472
#define TVIS_EXPANDED
Definition: commctrl.h:3289
#define TVN_ITEMEXPANDINGW
Definition: commctrl.h:3705
#define TVN_BEGINLABELEDITW
Definition: commctrl.h:3715
#define TreeView_EditLabel(hwnd, hitem)
Definition: commctrl.h:3509
#define TVIF_PARAM
Definition: commctrl.h:3273
#define TVN_SELCHANGEDA
Definition: commctrl.h:3652
#define TreeView_SetImageList(hwnd, himl, iImage)
Definition: commctrl.h:3452
#define TVIF_CHILDREN
Definition: commctrl.h:3277
#define TreeView_HitTest(hwnd, lpht)
Definition: commctrl.h:3518
#define TreeView_InsertItem(hwnd, lpis)
Definition: commctrl.h:3417
#define TVIF_SELECTEDIMAGE
Definition: commctrl.h:3276
#define TVN_ENDLABELEDITW
Definition: commctrl.h:3717
#define TreeView_SetItem(hwnd, pitem)
Definition: commctrl.h:3502
#define TVN_DELETEITEMW
Definition: commctrl.h:3713
#define TVIF_STATE
Definition: commctrl.h:3274
#define TreeView_DeleteItem(hwnd, hitem)
Definition: commctrl.h:3420
static unsigned __int64 next
Definition: rand_nt.c:6
#define WM_CONTEXTMENU
Definition: richedit.h:64
#define WM_NOTIFY
Definition: richedit.h:61
HRESULT WINAPI SHForwardContextMenuMsg(IUnknown *pUnk, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pResult, BOOL useIContextMenu2)
Definition: rosordinal.c:11
const WCHAR * str
#define _WIN32_WINNT_WINXP
Definition: sdkddkver.h:22
DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path, DWORD dwFileAttributes, SHFILEINFOW *psfi, UINT sizeofpsfi, UINT flags)
Definition: shell32_main.c:430
static __inline LPWSTR __SHCloneStrAtoW(WCHAR **target, const char *source)
Definition: shell32_main.h:184
#define SHGFI_DISPLAYNAME
Definition: shellapi.h:167
#define SHGFI_PIDL
Definition: shellapi.h:181
BOOL WINAPI StrRetToStrNW(LPWSTR dest, DWORD len, LPSTRRET src, const ITEMIDLIST *pidl)
Definition: shellstring.c:85
void WINAPI _InsertMenuItemW(HMENU hmenu, UINT indexMenu, BOOL fByPosition, UINT wID, UINT fType, LPCWSTR dwTypeData, UINT fState)
HRESULT hr
Definition: shlfolder.c:183
#define BIF_STATUSTEXT
Definition: shlobj.h:1227
#define SHCNE_DRIVEREMOVED
Definition: shlobj.h:1905
#define BFFM_SETOKTEXT
Definition: shlobj.h:1256
#define CSIDL_DESKTOPDIRECTORY
Definition: shlobj.h:2196
#define BFFM_SELCHANGED
Definition: shlobj.h:1245
#define SHCNE_RMDIR
Definition: shlobj.h:1902
#define BIF_NOTRANSLATETARGETS
Definition: shlobj.h:1236
#define BIF_RETURNONLYFSDIRS
Definition: shlobj.h:1225
#define SHCNE_DELETE
Definition: shlobj.h:1900
#define SHCNE_MKDIR
Definition: shlobj.h:1901
@ SHGFP_TYPE_CURRENT
Definition: shlobj.h:2157
#define BIF_RETURNFSANCESTORS
Definition: shlobj.h:1228
#define SHCNE_UPDATEITEM
Definition: shlobj.h:1911
#define CSIDL_PERSONAL
Definition: shlobj.h:2186
#define BFFM_SETEXPANDED
Definition: shlobj.h:1257
#define SHCNE_RENAMEITEM
Definition: shlobj.h:1898
#define SHCNE_UPDATEDIR
Definition: shlobj.h:1910
#define BFFM_ENABLEOK
Definition: shlobj.h:1252
#define SHCNE_CREATE
Definition: shlobj.h:1899
#define BFFM_SETSELECTION
Definition: shlobj.h:1264
#define SHCNE_RENAMEFOLDER
Definition: shlobj.h:1915
#define BIF_USENEWUI
Definition: shlobj.h:1232
#define SHCNRF_NewDelivery
Definition: shlobj.h:1946
#define SHCNRF_ShellLevel
Definition: shlobj.h:1944
#define BFFM_SETSELECTIONW
Definition: shlobj.h:1254
#define BIF_BROWSEINCLUDEFILES
Definition: shlobj.h:1240
#define SHCNE_DRIVEADD
Definition: shlobj.h:1906
#define BFFM_SETSTATUSTEXTW
Definition: shlobj.h:1255
#define CSIDL_DESKTOP
Definition: shlobj.h:2181
#define BFFM_INITIALIZED
Definition: shlobj.h:1244
#define SHCNE_ALLEVENTS
Definition: shlobj.h:1922
#define BFFM_SETSTATUSTEXTA
Definition: shlobj.h:1251
#define BIF_NONEWFOLDERBUTTON
Definition: shlobj.h:1235
#define CSIDL_DRIVES
Definition: shlobj.h:2197
#define DFM_CMD_RENAME
Definition: shlobj.h:2628
#define BIF_NEWDIALOGSTYLE
Definition: shlobj.h:1231
#define SHCNE_INTERRUPT
Definition: shlobj.h:1923
#define BIF_EDITBOX
Definition: shlobj.h:1229
#define BIF_BROWSEFORCOMPUTER
Definition: shlobj.h:1238
#define BFFM_SETSELECTIONA
Definition: shlobj.h:1253
HRESULT WINAPI SHAutoComplete(HWND hwndEdit, DWORD dwFlags)
Definition: autocomp.cpp:191
#define SHACF_FILESYSTEM
Definition: shlwapi.h:1957
#define SHACF_URLHISTORY
Definition: shlwapi.h:1958
#define SHACF_FILESYS_ONLY
Definition: shlwapi.h:1962
#define IDD_BROWSE_FOR_FOLDER_NEW
Definition: shresdef.h:460
#define IDC_BROWSE_FOR_FOLDER_FOLDER_TEXT
Definition: shresdef.h:462
#define IDC_BROWSE_FOR_FOLDER_TREEVIEW
Definition: shresdef.h:466
#define IDC_BROWSE_FOR_FOLDER_NEW_FOLDER
Definition: shresdef.h:461
#define IDD_BROWSE_FOR_FOLDER
Definition: shresdef.h:459
#define IDC_BROWSE_FOR_FOLDER_STATUS
Definition: shresdef.h:464
#define IDC_BROWSE_FOR_FOLDER_TITLE
Definition: shresdef.h:465
#define IDC_BROWSE_FOR_FOLDER_FOLDER
Definition: shresdef.h:463
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
const ITEMID_CHILD UNALIGNED * PCUITEMID_CHILD
Definition: shtypes.idl:70
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
#define _countof(array)
Definition: sndvol32.h:70
#define TRACE(s)
Definition: solgame.cpp:4
ULONG hChangeNotify
Definition: brfolder.cpp:47
IContextMenu * pContextMenu
Definition: brfolder.cpp:48
HWND hWnd
Definition: brfolder.cpp:42
LPBROWSEINFOW lpBrowseInfo
Definition: brfolder.cpp:41
LAYOUT_DATA * layout
Definition: brfolder.cpp:45
PIDLIST_ABSOLUTE pidlRet
Definition: brfolder.cpp:44
SIZE szMin
Definition: brfolder.cpp:46
HWND hwndTreeView
Definition: brfolder.cpp:43
PCIDLIST_RELATIVE pidlChild
Definition: brfolder.cpp:54
CComHeapPtr< ITEMIDLIST_ABSOLUTE > pidlFull
Definition: brfolder.cpp:55
CComPtr< IShellFolder > lpsfParent
Definition: brfolder.cpp:53
OLE initialisation for drag drop support.
Definition: shellclasses.h:202
PCIDLIST_ABSOLUTE pidl
Definition: shlobj.h:1894
WCHAR szDisplayName[MAX_PATH]
Definition: shellapi.h:376
Definition: ftp_var.h:139
Definition: name.c:39
LPCSTR lpszTitle
Definition: shlobj.h:1200
PCIDLIST_ABSOLUTE pidlRoot
Definition: shlobj.h:1198
BFFCALLBACK lpfn
Definition: shlobj.h:1202
HWND hwndOwner
Definition: shlobj.h:1197
LPSTR pszDisplayName
Definition: shlobj.h:1199
UINT ulFlags
Definition: shlobj.h:1201
LPARAM lParam
Definition: shlobj.h:1203
BFFCALLBACK lpfn
Definition: shlobj.h:1213
PCIDLIST_ABSOLUTE pidlRoot
Definition: shlobj.h:1209
UINT ulFlags
Definition: shlobj.h:1212
LPWSTR pszDisplayName
Definition: shlobj.h:1210
HWND hwndOwner
Definition: shlobj.h:1208
LPCWSTR lpszTitle
Definition: shlobj.h:1211
LPARAM lParam
Definition: shlobj.h:1214
UINT_PTR idFrom
Definition: winuser.h:3169
UINT code
Definition: winuser.h:3170
HWND hwndFrom
Definition: winuser.h:3168
TVITEMW itemNew
Definition: commctrl.h:3643
TVITEMW itemOld
Definition: commctrl.h:3642
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48
LONG right
Definition: windef.h:308
LONG bottom
Definition: windef.h:309
LONG top
Definition: windef.h:307
LONG left
Definition: windef.h:306
TVITEMW item
Definition: commctrl.h:3677
HTREEITEM hItem
Definition: commctrl.h:3322
LPARAM lParam
Definition: commctrl.h:3330
UINT mask
Definition: commctrl.h:3321
LPWSTR pszText
Definition: commctrl.h:3325
int iImage
Definition: commctrl.h:3327
UINT state
Definition: commctrl.h:3323
int iSelectedImage
Definition: commctrl.h:3328
#define SetWindowLongPtr
Definition: treelist.c:70
HTREEITEM hItem
Definition: treelist.h:37
uint16_t * PWSTR
Definition: typedefs.h:56
int32_t INT_PTR
Definition: typedefs.h:64
PVOID HANDLE
Definition: typedefs.h:73
ULONG_PTR SIZE_T
Definition: typedefs.h:80
int32_t INT
Definition: typedefs.h:58
uint32_t ULONG
Definition: typedefs.h:59
DWORD dwAttributes
Definition: vdmdbg.h:34
int ret
UINT WINAPI GetDlgItemTextW(HWND hDlg, int nIDDlgItem, LPWSTR lpString, int nMaxCount)
Definition: dialog.c:2263
#define ZeroMemory
Definition: winbase.h:1743
#define CopyMemory
Definition: winbase.h:1741
_In_ DWORD _In_ DWORD _Out_writes_to_opt_ pcchString LPSTR pszString
Definition: wincrypt.h:4505
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176
LONG_PTR LPARAM
Definition: windef.h:208
LONG_PTR LRESULT
Definition: windef.h:209
UINT_PTR WPARAM
Definition: windef.h:207
#define WINAPI
Definition: msvc.h:6
#define GET_Y_LPARAM(lp)
Definition: windowsx.h:300
#define GET_X_LPARAM(lp)
Definition: windowsx.h:299
#define S_FALSE
Definition: winerror.h:2357
HWND WINAPI SetCapture(_In_ HWND hWnd)
HMENU WINAPI CreatePopupMenu(void)
Definition: menu.c:838
#define SW_HIDE
Definition: winuser.h:779
#define DWLP_USER
Definition: winuser.h:883
#define GetWindowLongPtrW
Definition: winuser.h:4840
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
BOOL WINAPI ReleaseCapture(void)
Definition: message.c:2890
#define IDCANCEL
Definition: winuser.h:842
BOOL WINAPI GetWindowRect(_In_ HWND, _Out_ LPRECT)
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
#define WM_SIZE
Definition: winuser.h:1622
#define WM_COMMAND
Definition: winuser.h:1751
#define BF_LEFT
Definition: winuser.h:454
#define IDC_ARROW
Definition: winuser.h:695
#define VK_CONTROL
Definition: winuser.h:2214
BOOL WINAPI SetDlgItemTextW(_In_ HWND, _In_ int, _In_ LPCWSTR)
HCURSOR WINAPI SetCursor(_In_opt_ HCURSOR)
#define BF_BOTTOM
Definition: winuser.h:457
#define WM_INITDIALOG
Definition: winuser.h:1750
#define MFT_SEPARATOR
Definition: winuser.h:755
BOOL WINAPI MessageBeep(_In_ UINT uType)
HCURSOR WINAPI LoadCursorW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
Definition: cursoricon.c:2442
BOOL WINAPI TrackPopupMenuEx(_In_ HMENU, _In_ UINT, _In_ int, _In_ int, _In_ HWND, _In_opt_ LPTPMPARAMS)
int WINAPI MapWindowPoints(_In_opt_ HWND hWndFrom, _In_opt_ HWND hWndTo, _Inout_updates_(cPoints) LPPOINT lpPoints, _In_ UINT cPoints)
BOOL WINAPI ClientToScreen(_In_ HWND, _Inout_ LPPOINT)
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
#define IDOK
Definition: winuser.h:841
#define MFS_DEFAULT
Definition: winuser.h:759
BOOL WINAPI SetWindowTextW(_In_ HWND, _In_opt_ LPCWSTR)
#define WM_GETMINMAXINFO
Definition: winuser.h:1651
#define VK_F5
Definition: winuser.h:2270
#define MFS_GRAYED
Definition: winuser.h:762
#define BF_TOP
Definition: winuser.h:455
#define BF_RIGHT
Definition: winuser.h:456
BOOL WINAPI EnableWindow(_In_ HWND, _In_ BOOL)
BOOL WINAPI SetDlgItemTextA(_In_ HWND, _In_ int, _In_ LPCSTR)
#define MAKEINTRESOURCEA(i)
Definition: winuser.h:581
BOOL WINAPI DestroyMenu(_In_ HMENU)
#define DWLP_MSGRESULT
Definition: winuser.h:881
#define IDC_WAIT
Definition: winuser.h:697
struct tagMINMAXINFO * LPMINMAXINFO
#define VK_SHIFT
Definition: winuser.h:2213
#define MFT_STRING
Definition: winuser.h:757
#define SW_SHOW
Definition: winuser.h:786
#define VK_DELETE
Definition: winuser.h:2244
#define WM_DESTROY
Definition: winuser.h:1620
BOOL WINAPI InvalidateRect(_In_opt_ HWND, _In_opt_ LPCRECT, _In_ BOOL)
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
#define TPM_RETURNCMD
Definition: winuser.h:2398
#define SetWindowLongPtrW
Definition: winuser.h:5366
BOOL WINAPI MoveWindow(_In_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ BOOL)
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
SHORT WINAPI GetKeyState(_In_ int)
INT_PTR WINAPI DialogBoxParamW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM)
BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR)
#define WM_SETREDRAW
Definition: winuser.h:1627
BOOL WINAPI ScreenToClient(_In_ HWND, _Inout_ LPPOINT)
#define VK_F2
Definition: winuser.h:2267
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
#define IID_PPV_ARG(Itype, ppType)
#define IID_NULL_PPV_ARG(Itype, ppType)
char * LPSTR
Definition: xmlstorage.h:182
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
unsigned char BYTE
Definition: xxhash.c:193