ReactOS 0.4.16-dev-141-g4c84e19
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
16
17#define SHV_CHANGE_NOTIFY (WM_USER + 0x1111)
18
20{
25 LAYOUT_DATA* layout; // Filled by LayoutInit, used by LayoutUpdate
27 ULONG hChangeNotify; // Change notification handle
28 IContextMenu* pContextMenu; // Active context menu
29};
30
32{
33 CComPtr<IShellFolder> lpsfParent; // IShellFolder of the parent
34 PCIDLIST_RELATIVE pidlChild; // PIDL relative to parent
36};
37
38static const LAYOUT_INFO g_layout_info[] =
39{
45 { IDOK, BF_BOTTOM | BF_RIGHT },
47};
48
49#define SUPPORTED_FLAGS (BIF_STATUSTEXT | BIF_BROWSEFORCOMPUTER | BIF_RETURNFSANCESTORS | \
50 BIF_RETURNONLYFSDIRS | BIF_NONEWFOLDERBUTTON | BIF_NEWDIALOGSTYLE | \
51 BIF_BROWSEINCLUDEFILES)
52
53static HTREEITEM
57 _In_ PCUITEMID_CHILD pidlChild,
58 _In_ PCIDLIST_ABSOLUTE pidlParent,
59 _In_ HTREEITEM hParent);
60
61static inline DWORD
63{
64 return SHCONTF_FOLDERS | ((ulFlags & BIF_BROWSEINCLUDEFILES) ? SHCONTF_NONFOLDERS : 0);
65}
66
67static void
69{
70 if (!lpBrowseInfo->lpfn)
71 return;
72 lpBrowseInfo->lpfn(hWnd, uMsg, lParam, lpBrowseInfo->lParam);
73}
74
75static BrItemData *
77{
79 item.hItem = hItem;
80 if (!TreeView_GetItem(info->hwndTreeView, &item))
81 {
82 ERR("TreeView_GetItem failed\n");
83 return NULL;
84 }
85 return (BrItemData *)item.lParam;
86}
87
88static SFGAOF
90{
92 HRESULT hr = item ? item->lpsfParent->GetAttributesOf(1, &item->pidlChild, &Att) : E_FAIL;
93 return SUCCEEDED(hr) ? Att : 0;
94}
95
96static HRESULT
99 _In_ BrItemData *pItemData,
100 _Outptr_opt_ IEnumIDList **ppEnum)
101{
102 if (!pItemData)
103 return E_FAIL;
104
105 CComPtr<IEnumIDList> pEnumIL;
106 PCUITEMID_CHILD pidlRef = pItemData->pidlChild;
107 ULONG attrs = SFGAO_HASSUBFOLDER | SFGAO_FOLDER;
108 IShellFolder *lpsf = pItemData->lpsfParent;
109 HRESULT hr = lpsf->GetAttributesOf(1, &pidlRef, &attrs);
110 if (FAILED_UNEXPECTEDLY(hr) || !(attrs & SFGAO_FOLDER))
111 return E_FAIL;
112
113 CComPtr<IShellFolder> psfChild;
114 if (_ILIsDesktop(pItemData->pidlFull))
115 hr = SHGetDesktopFolder(&psfChild);
116 else
117 hr = lpsf->BindToObject(pidlRef, NULL, IID_PPV_ARG(IShellFolder, &psfChild));
119 return E_FAIL;
120
121 DWORD flags = BrowseFlagsToSHCONTF(info->lpBrowseInfo->ulFlags);
122 hr = psfChild->EnumObjects(info->hWnd, flags, &pEnumIL);
123 if (hr == S_OK)
124 {
125 if ((pEnumIL->Skip(1) != S_OK) || FAILED(pEnumIL->Reset()))
126 pEnumIL = NULL;
127 }
128
129 if (!pEnumIL || !(attrs & SFGAO_HASSUBFOLDER))
130 return E_FAIL; // No children
131
132 if (ppEnum)
133 *ppEnum = pEnumIL.Detach();
134
135 return S_OK; // There are children
136}
137
138/******************************************************************************
139 * BrFolder_InitTreeView [Internal]
140 *
141 * Called from WM_INITDIALOG handler.
142 */
143static void
145{
146 HIMAGELIST hImageList;
147 HRESULT hr;
148 CComPtr<IShellFolder> lpsfParent;
149 CComPtr<IEnumIDList> pEnumChildren;
151
152 Shell_GetImageLists(NULL, &hImageList);
153
154 if (hImageList)
155 TreeView_SetImageList(info->hwndTreeView, hImageList, 0);
156
157 /* We want to call BrFolder_InsertItem down the code, in order to insert
158 * the root item of the treeview. Due to BrFolder_InsertItem's signature,
159 * we need the following to do this:
160 *
161 * + An ITEMIDLIST corresponding to _the parent_ of root.
162 * + An ITEMIDLIST, which is a relative path from root's parent to root
163 * (containing a single SHITEMID).
164 * + An IShellFolder interface pointer of root's parent folder.
165 *
166 * If root is 'Desktop', then root's parent is also 'Desktop'.
167 */
168
169 PCIDLIST_ABSOLUTE pidlRoot = info->lpBrowseInfo->pidlRoot;
170 CComHeapPtr<ITEMIDLIST_ABSOLUTE> pidlParent(ILClone(pidlRoot));
171 ILRemoveLastID(pidlParent);
172 PCIDLIST_RELATIVE pidlChild = ILFindLastID(pidlRoot);
173
174 if (_ILIsDesktop(pidlParent))
175 {
176 hr = SHGetDesktopFolder(&lpsfParent);
178 return;
179 }
180 else
181 {
182 CComPtr<IShellFolder> lpsfDesktop;
183 hr = SHGetDesktopFolder(&lpsfDesktop);
185 return;
186
187 hr = lpsfDesktop->BindToObject(pidlParent, NULL, IID_PPV_ARG(IShellFolder, &lpsfParent));
189 return;
190 }
191
192 TreeView_DeleteItem(info->hwndTreeView, TVI_ROOT);
193 hItem = BrFolder_InsertItem(info, lpsfParent, pidlChild, pidlParent, TVI_ROOT);
194 TreeView_Expand(info->hwndTreeView, hItem, TVE_EXPAND);
195}
196
197static INT
199{
200 SHFILEINFOW sfi;
201 SHGetFileInfoW((LPCWSTR)pidl, 0, &sfi, sizeof(sfi), uFlags);
202 return sfi.iIcon;
203}
204
205static void
207{
208 DWORD flags;
209
211 if (!pidl)
212 {
213 pidlDesktop.Attach(_ILCreateDesktop());
214 pidl = pidlDesktop;
215 }
216
218 pItem->iImage = BrFolder_GetIcon(pidl, flags);
219
221 pItem->iSelectedImage = BrFolder_GetIcon(pidl, flags);
222}
223
224/******************************************************************************
225 * BrFolder_GetName [Internal]
226 *
227 * Query a shell folder for the display name of one of its children
228 *
229 * PARAMS
230 * lpsf [I] IShellFolder interface of the folder to be queried.
231 * pidlChild [I] ITEMIDLIST of the child, relative to parent
232 * dwFlags [I] as in IShellFolder::GetDisplayNameOf
233 * lpFriendlyName [O] The desired display name in unicode
234 *
235 * RETURNS
236 * Success: TRUE
237 * Failure: FALSE
238 */
239static BOOL
241 IShellFolder *lpsf,
242 PCIDLIST_RELATIVE pidlChild,
244 LPWSTR lpFriendlyName)
245{
247 STRRET str;
248
249 TRACE("%p %p %x %p\n", lpsf, pidlChild, dwFlags, lpFriendlyName);
250 if (!FAILED_UNEXPECTEDLY(lpsf->GetDisplayNameOf(pidlChild, dwFlags, &str)))
251 bSuccess = StrRetToStrNW(lpFriendlyName, MAX_PATH, &str, pidlChild);
252
253 TRACE("-- %s\n", debugstr_w(lpFriendlyName));
254 return bSuccess;
255}
256
257static BOOL
261 _Inout_ IEnumIDList *pEnum)
262{
264 if (!pItemData)
265 return FALSE;
266
267 pEnum->Reset();
268
270 while (pEnum->Next(1, &pidlTemp, NULL) == S_OK)
271 {
272 if (ILIsEqual(pidlTemp, pItemData->pidlChild))
273 return TRUE;
274
275 pidlTemp.Free();
276 }
277
278 return FALSE;
279}
280
281static BOOL
285 _Outptr_opt_ PITEMID_CHILD pidlChild)
286{
287 for (hItem = TreeView_GetChild(info->hwndTreeView, hItem); hItem;
288 hItem = TreeView_GetNextSibling(info->hwndTreeView, hItem))
289 {
291 if (ILIsEqual(pItemData->pidlChild, pidlChild))
292 return TRUE;
293 }
294
295 return FALSE;
296}
297
298static void
302{
304 if (!pItemData)
305 return;
306
308 item.hItem = hItem;
309
310 BrFolder_GetIconPair(pItemData->pidlFull, &item);
311
312 item.cChildren = 0;
314 if (BrFolder_GetChildrenEnum(info, pItemData, &pEnum) == S_OK)
315 {
317 if (pEnum->Next(1, &pidlTemp, NULL) == S_OK)
318 ++item.cChildren;
319 }
320
321 TreeView_SetItem(info->hwndTreeView, &item);
322}
323
324/******************************************************************************
325 * BrFolder_InsertItem [Internal]
326 *
327 * PARAMS
328 * info [I] data for the dialog
329 * lpsf [I] IShellFolder interface of the item's parent shell folder
330 * pidlChild [I] ITEMIDLIST of the child to insert, relative to parent
331 * pidlParent [I] ITEMIDLIST of the parent shell folder
332 * hParent [I] The treeview-item that represents the parent shell folder
333 *
334 * RETURNS
335 * Success: Handle to the created and inserted treeview-item
336 * Failure: NULL
337 */
338static HTREEITEM
341 _Inout_ IShellFolder *lpsf,
342 _In_ PCUITEMID_CHILD pidlChild,
343 _In_ PCIDLIST_ABSOLUTE pidlParent,
344 _In_ HTREEITEM hParent)
345{
346 if (!(BrowseFlagsToSHCONTF(info->lpBrowseInfo->ulFlags) & SHCONTF_NONFOLDERS))
347 {
348#ifdef BIF_BROWSEFILEJUNCTIONS
349 if (!(info->lpBrowseInfo->ulFlags & BIF_BROWSEFILEJUNCTIONS))
350#endif
351 if (SHGetAttributes(lpsf, pidlChild, SFGAO_STREAM) & SFGAO_STREAM)
352 return NULL; // .zip files have both FOLDER and STREAM attributes set
353 }
354
356 if (!BrFolder_GetName(lpsf, pidlChild, SHGDN_NORMAL, szName))
357 return NULL;
358
359 BrItemData *pItemData = new BrItemData();
360
362 item.pszText = szName;
363 item.cchTextMax = _countof(szName);
364 item.lParam = (LPARAM)pItemData;
365
366 PIDLIST_ABSOLUTE pidlFull =
367 (pidlParent ? ILCombine(pidlParent, pidlChild) : ILClone(pidlChild));
368 BrFolder_GetIconPair(pidlFull, &item);
369
370 pItemData->lpsfParent = lpsf;
371 pItemData->pidlFull.Attach(pidlFull);
372 pItemData->pidlChild = ILFindLastID(pItemData->pidlFull);
373
374 if (BrFolder_GetChildrenEnum(info, pItemData, NULL) == S_OK)
375 item.cChildren = 1;
376
377 TVINSERTSTRUCTW tvins = { hParent };
378 tvins.item = item;
379 return TreeView_InsertItem(info->hwndTreeView, &tvins);
380}
381
382/******************************************************************************
383 * BrFolder_Expand [Internal]
384 *
385 * For each child (given by pEnum) of the parent shell folder, which is given by
386 * lpsf and whose PIDL is pidl, insert a treeview-item right under hParent
387 *
388 * PARAMS
389 * info [I] data for the dialog
390 * lpsf [I] IShellFolder interface of the parent shell folder
391 * pidl [I] ITEMIDLIST of the parent shell folder
392 * hParent [I] The treeview item that represents the parent shell folder
393 * pEnum [I] An iterator for the children of the parent shell folder
394 */
395static void
398 _In_ IShellFolder *lpsf,
399 _In_ PCIDLIST_ABSOLUTE pidlFull,
400 _In_ HTREEITEM hParent)
401{
402 TRACE("%p %p %p\n", lpsf, pidlFull, hParent);
403
404 // No IEnumIDList -> No children
405 BrItemData *pItemData = BrFolder_GetItemData(info, hParent);
407 HRESULT hr = BrFolder_GetChildrenEnum(info, pItemData, &pEnum);
408 if (FAILED(hr))
409 return;
410
411 SetCapture(info->hWnd);
413
415 ULONG ulFetched;
416 while (S_OK == pEnum->Next(1, &pidlTemp, &ulFetched))
417 {
418 if (!BrFolder_InsertItem(info, lpsf, pidlTemp, pidlFull, hParent))
419 break;
420 pidlTemp.Free(); // Finally, free the pidl that the shell gave us...
421 }
422
425}
426
427static inline BOOL
429{
431 if (!data)
432 return FALSE;
433 return (data->type == type);
434}
435
436static void
438{
439 LPBROWSEINFOW lpBrowseInfo = info->lpBrowseInfo;
440 PCIDLIST_RELATIVE pidlChild = pItemData->pidlChild;
442 HRESULT hr;
443
444 BOOL bEnabled = TRUE;
445 if ((lpBrowseInfo->ulFlags & BIF_BROWSEFORCOMPUTER) && !PIDLIsType(pidlChild, PT_COMP))
446 bEnabled = FALSE;
447
448 if (lpBrowseInfo->ulFlags & BIF_RETURNFSANCESTORS)
449 {
450 dwAttributes = SFGAO_FILESYSANCESTOR | SFGAO_FILESYSTEM;
451 hr = pItemData->lpsfParent->GetAttributesOf(1, &pidlChild, &dwAttributes);
452 if (FAILED(hr) || !(dwAttributes & (SFGAO_FILESYSANCESTOR | SFGAO_FILESYSTEM)))
453 bEnabled = FALSE;
454 }
455
456 dwAttributes = SFGAO_FOLDER | SFGAO_FILESYSTEM;
457 hr = pItemData->lpsfParent->GetAttributesOf(1, &pidlChild, &dwAttributes);
458 if (FAILED_UNEXPECTEDLY(hr) ||
459 ((dwAttributes & (SFGAO_FOLDER | SFGAO_FILESYSTEM)) != (SFGAO_FOLDER | SFGAO_FILESYSTEM)))
460 {
461 if (lpBrowseInfo->ulFlags & BIF_RETURNONLYFSDIRS)
462 bEnabled = FALSE;
464 }
465 else
466 {
468 }
469
470 SendMessageW(info->hWnd, BFFM_ENABLEOK, 0, bEnabled);
471}
472
473static LRESULT
475{
476 BrItemData *pItemData = (BrItemData *)pnmtv->itemOld.lParam;
477
478 TRACE("TVN_DELETEITEMA/W %p\n", pItemData);
479
480 delete pItemData;
481 return 0;
482}
483
484static LRESULT
486{
487 BrItemData *pItemData = (BrItemData *)pnmtv->itemNew.lParam;
488
489 TRACE("TVN_ITEMEXPANDINGA/W\n");
490
491 if ((pnmtv->itemNew.state & TVIS_EXPANDEDONCE))
492 return 0;
493
494 HRESULT hr = S_OK;
496 if (!_ILIsEmpty(pItemData->pidlChild))
497 {
498 hr = pItemData->lpsfParent->BindToObject(pItemData->pidlChild, NULL,
499 IID_PPV_ARG(IShellFolder, &lpsf2));
500 }
501 else
502 {
503 lpsf2 = pItemData->lpsfParent;
504 }
505
506 HTREEITEM hItem = pnmtv->itemNew.hItem;
508 BrFolder_Expand(info, lpsf2, pItemData->pidlFull, hItem);
509
510 // My Computer is already sorted and trying to do a simple text
511 // sort will only mess things up
512 if (!_ILIsMyComputer(pItemData->pidlChild))
513 TreeView_SortChildren(info->hwndTreeView, hItem, FALSE);
514
515 return 0;
516}
517
518static HRESULT
520{
521 BrItemData *pItemData = (BrItemData *)pnmtv->itemNew.lParam;
522
523 ILFree(info->pidlRet);
524 info->pidlRet = ILClone(pItemData->pidlFull);
525
527 if (BrFolder_GetName(pItemData->lpsfParent, pItemData->pidlChild, SHGDN_NORMAL, szName))
529
530 BrFolder_Callback(info->lpBrowseInfo, info->hWnd, BFFM_SELCHANGED, (LPARAM)info->pidlRet);
532 return S_OK;
533}
534
535static LRESULT
537{
538 if (!pnmtv->item.pszText)
539 return FALSE;
540
541 HTREEITEM hItem = TreeView_GetSelection(info->hwndTreeView);
543 ASSERT(data);
544 ASSERT(BrFolder_GetItemAttributes(info, hItem, SFGAO_CANRENAME) & SFGAO_CANRENAME);
545
546 PITEMID_CHILD newChild;
547 HRESULT hr = data->lpsfParent->SetNameOf(info->hWnd, data->pidlChild,
548 pnmtv->item.pszText, SHGDN_NORMAL, &newChild);
549 if (FAILED(hr))
550 return FALSE;
551
552 LPITEMIDLIST newFull;
553 if (SUCCEEDED(hr = SHILClone(data->pidlFull, &newFull)))
554 {
555 ILRemoveLastID(newFull);
556 if (SUCCEEDED(hr = SHILAppend(newChild, &newFull)))
557 {
558 data->pidlFull.Free();
559 data->pidlFull.Attach(newFull);
560 data->pidlChild = ILFindLastID(data->pidlFull);
561 }
562 newChild = NULL; // SHILAppend is nuts and frees this
563 }
564 ILFree(newChild);
565
566 NMTREEVIEWW nmtv;
567 nmtv.itemNew.lParam = (LPARAM)data;
569 return TRUE;
570}
571
572static HRESULT
574{
575 TreeView_SelectItem(info->hwndTreeView, hItem);
576 TreeView_EditLabel(info->hwndTreeView, hItem);
577 return S_OK;
578}
579
580static void
582{
583 SHFILEOPSTRUCTW fileop = { info->hwndTreeView };
584 WCHAR szzFrom[MAX_PATH + 1];
585
586 // Get item_data
588
589 // Get the path
590 if (!SHGetPathFromIDListW(item_data->pidlFull, szzFrom))
591 {
592 ERR("SHGetPathFromIDListW failed\n");
593 return;
594 }
595 szzFrom[lstrlenW(szzFrom) + 1] = UNICODE_NULL; // Double NULL-terminated
596 fileop.pFrom = szzFrom;
597
598 // Delete folder
599 fileop.fFlags = FOF_ALLOWUNDO;
600 fileop.wFunc = FO_DELETE;
601 SHFileOperationW(&fileop);
602}
603
604static void
606
607static LRESULT
609{
610 // Old dialog doesn't support those advanced features
611 if (!(info->lpBrowseInfo->ulFlags & BIF_USENEWUI))
612 return 0;
613
614 HTREEITEM hItem = TreeView_GetSelection(info->hwndTreeView);
615
616 switch (keydown->wVKey)
617 {
618 case VK_F2:
620 break;
621 case VK_DELETE:
623 break;
624 case 'R':
625 {
626 if (GetKeyState(VK_CONTROL) < 0) // Ctrl+R
628 break;
629 }
630 case VK_F5:
631 {
633 break;
634 }
635 }
636 return 0;
637}
638
639static LRESULT
641{
642 NMTREEVIEWW *pnmtv = (NMTREEVIEWW *)lpnmh;
643
644 TRACE("%p %x %p msg=%x\n", info, CtlID, lpnmh, pnmtv->hdr.code);
645
647 return 0;
648
649 switch (pnmtv->hdr.code)
650 {
651 case TVN_DELETEITEMA:
652 case TVN_DELETEITEMW:
653 return BrFolder_Treeview_Delete(info, pnmtv);
654
657 return BrFolder_Treeview_Expand(info, pnmtv);
658
659 case TVN_SELCHANGEDA:
660 case TVN_SELCHANGEDW:
661 return BrFolder_Treeview_Changed(info, pnmtv);
662
665 {
666 NMTVDISPINFO &tvdi = *(NMTVDISPINFO*)lpnmh;
667 UINT att = BrFolder_GetItemAttributes(info, tvdi.item.hItem, SFGAO_CANRENAME);
668 return !(att & SFGAO_CANRENAME);
669 }
670
673
674 case TVN_KEYDOWN:
676
677 default:
678 WARN("unhandled (%d)\n", pnmtv->hdr.code);
679 break;
680 }
681
682 return 0;
683}
684
685static BOOL
687{
690 LPBROWSEINFOW lpBrowseInfo = info->lpBrowseInfo;
691
692 info->hWnd = hWnd;
694
695 if (lpBrowseInfo->ulFlags & BIF_NEWDIALOGSTYLE)
696 FIXME("flags BIF_NEWDIALOGSTYLE partially implemented\n");
697
698 if (lpBrowseInfo->ulFlags & ~SUPPORTED_FLAGS)
699 FIXME("flags %x not implemented\n", (lpBrowseInfo->ulFlags & ~SUPPORTED_FLAGS));
700
701 info->layout = NULL;
702 if (lpBrowseInfo->ulFlags & BIF_USENEWUI)
703 {
704 RECT rcWnd;
705
706 // Resize the treeview if there's not editbox
707 if ((lpBrowseInfo->ulFlags & BIF_NEWDIALOGSTYLE) &&
708 !(lpBrowseInfo->ulFlags & BIF_EDITBOX))
709 {
710 RECT rcEdit, rcTreeView;
713 LONG cy = rcTreeView.top - rcEdit.top;
714 MapWindowPoints(NULL, hWnd, (LPPOINT)&rcTreeView, sizeof(RECT) / sizeof(POINT));
715 rcTreeView.top -= cy;
717 rcTreeView.left, rcTreeView.top,
718 rcTreeView.right - rcTreeView.left,
719 rcTreeView.bottom - rcTreeView.top, TRUE);
720 }
721
722 if (lpBrowseInfo->ulFlags & BIF_NEWDIALOGSTYLE)
724
725 // TODO: Windows allows shrinking the windows a bit
726 GetWindowRect(hWnd, &rcWnd);
727 info->szMin.cx = rcWnd.right - rcWnd.left;
728 info->szMin.cy = rcWnd.bottom - rcWnd.top;
729 }
730
731 if (lpBrowseInfo->lpszTitle)
733 else
735
736 if (!(lpBrowseInfo->ulFlags & BIF_STATUSTEXT) || (lpBrowseInfo->ulFlags & BIF_USENEWUI))
738
739 // Hide "Make New Folder" Button?
740 if ((lpBrowseInfo->ulFlags & BIF_NONEWFOLDERBUTTON) ||
741 !(lpBrowseInfo->ulFlags & BIF_NEWDIALOGSTYLE))
742 {
744 }
745
746 // Hide the editbox?
747 if (!(lpBrowseInfo->ulFlags & BIF_EDITBOX))
748 {
751 }
752
754 if (info->hwndTreeView)
756 else
757 ERR("treeview control missing!\n");
758
759 // Register for change notifications
760 SHGetFolderLocation(NULL, CSIDL_DESKTOP, NULL, 0, &pidlDesktop);
761
762 ntreg.pidl = pidlDesktop;
763 ntreg.fRecursive = TRUE;
764 info->hChangeNotify = SHChangeNotifyRegister(hWnd,
767 SHV_CHANGE_NOTIFY, 1, &ntreg);
768
769 BrFolder_Callback(info->lpBrowseInfo, hWnd, BFFM_INITIALIZED, 0);
770
773 return TRUE;
774}
775
776static HRESULT
778{
779 CComPtr<IShellFolder> desktop, cur;
780 WCHAR wszNewFolder[25], path[MAX_PATH], name[MAX_PATH];
781
782 HRESULT hr = SHGetDesktopFolder(&desktop);
784 return hr;
785
786 if (info->pidlRet)
787 {
788 hr = desktop->BindToObject(info->pidlRet, NULL, IID_PPV_ARG(IShellFolder, &cur));
790 return hr;
791
792 hr = SHGetPathFromIDListW(info->pidlRet, path);
793 }
794 else
795 {
796 cur = desktop;
798 }
799
801 return hr;
802
803 hr = E_FAIL;
804 if (!LoadStringW(shell32_hInstance, IDS_NEWFOLDER, wszNewFolder, _countof(wszNewFolder)))
805 return hr;
806
807 if (!PathYetAnotherMakeUniqueName(name, path, NULL, wszNewFolder))
808 return hr;
809
810 INT len = lstrlenW(path);
811 if (len < MAX_PATH && name[len] == L'\\')
812 len++;
813
815 return hr;
816
817 // Update parent of newly created directory
818 HTREEITEM hParent = TreeView_GetSelection(info->hwndTreeView);
819 if (!hParent)
820 return hr;
821
822 TreeView_Expand(info->hwndTreeView, hParent, TVE_EXPAND);
823
825 item.hItem = hParent;
826 TreeView_GetItem(info->hwndTreeView, &item);
827 BrItemData *item_data = (BrItemData *)item.lParam;
828 if (!item_data)
829 return hr;
830
831 // Update treeview
832 if (!(item.state & TVIS_EXPANDEDONCE))
833 {
834 item.mask = TVIF_STATE;
835 item.state = item.stateMask = TVIS_EXPANDEDONCE;
836 TreeView_SetItem(info->hwndTreeView, &item);
837 }
838
840 hr = cur->ParseDisplayName(NULL, NULL, name + len, NULL, &pidlNew, NULL);
842 return hr;
843
844 HTREEITEM hAdded = BrFolder_InsertItem(info, cur, pidlNew, item_data->pidlFull, hParent);
845 TreeView_SortChildren(info->hwndTreeView, hParent, FALSE);
846 return BrFolder_Rename(info, hAdded);
847}
848
849static void
851{
852 // Get the text
855 StrTrimW(szPath, L" \t");
856
857 // The original pidl is owned by the treeview and will be free'd.
859 info->pidlRet = ILCreateFromPathW(szPath); // It's valid path
860 else
861 info->pidlRet = ILClone(info->pidlRet);
862
863 if (!info->pidlRet) // A null pidl would mean a cancel
864 info->pidlRet = _ILCreateDesktop();
865
866 pdump(info->pidlRet);
867
868 LPBROWSEINFOW lpBrowseInfo = info->lpBrowseInfo;
869 if (!lpBrowseInfo->pszDisplayName)
870 return;
871
872 SHFILEINFOW fileInfo = { NULL };
873 lpBrowseInfo->pszDisplayName[0] = UNICODE_NULL;
874 if (SHGetFileInfoW((LPCWSTR)info->pidlRet, 0, &fileInfo, sizeof(fileInfo),
876 {
877 lstrcpynW(lpBrowseInfo->pszDisplayName, fileInfo.szDisplayName, MAX_PATH);
878 }
879}
880
881static void
883{
884 switch (id)
885 {
886 case IDOK:
887 {
889 EndDialog(info->hWnd, IDOK);
890 break;
891 }
892 case IDCANCEL:
893 {
894 EndDialog(info->hWnd, IDCANCEL);
895 break;
896 }
898 {
900 break;
901 }
902 }
903}
904
905static void
907{
908 RECT rc;
910 {
911 ppt->x = (rc.left + rc.right) / 2;
912 ppt->y = (rc.top + rc.bottom) / 2;
913 }
914 ClientToScreen(hWnd, ppt);
915}
916
917static void
919{
920 enum { IDC_TOGGLE = 1, ID_FIRSTCMD, ID_LASTCMD = 0xffff };
921 HTREEITEM hSelected = TreeView_GetSelection(info.hwndTreeView);
922 CMINVOKECOMMANDINFOEX ici = { sizeof(ici), CMIC_MASK_PTINVOKE, info.hWnd };
923 ici.nShow = SW_SHOW;
924 ici.ptInvoke.x = GET_X_LPARAM(lParam);
925 ici.ptInvoke.y = GET_Y_LPARAM(lParam);
926 if ((int)lParam == -1) // Keyboard
927 {
928 GetTreeViewItemContextMenuPos(info.hwndTreeView, hSelected, &ici.ptInvoke);
929 }
930 else // Get correct item for right-click on not current item
931 {
932 TVHITTESTINFO hti = { ici.ptInvoke };
933 ScreenToClient(info.hwndTreeView, &hti.pt);
934 hSelected = TreeView_HitTest(info.hwndTreeView, &hti);
935 }
937 if (!item)
938 return; // Not on an item
939
940 TV_ITEM tvi;
941 tvi.mask = TVIF_STATE | TVIF_CHILDREN;
942 tvi.stateMask = TVIS_EXPANDED;
943 tvi.hItem = hSelected;
944 TreeView_GetItem(info.hwndTreeView, &tvi);
945
947 HRESULT hr = item->lpsfParent->GetUIObjectOf(info.hWnd, 1, &item->pidlChild,
948 IID_IContextMenu, NULL, (void**)&pcm);
949 if (FAILED(hr))
950 return;
951
952 HMENU hMenu = CreatePopupMenu();
953 if (!hMenu)
954 return;
955 info.pContextMenu = pcm;
956 UINT cmf = ((GetKeyState(VK_SHIFT) < 0) ? CMF_EXTENDEDVERBS : 0) | CMF_CANRENAME;
957 hr = pcm->QueryContextMenu(hMenu, 0, ID_FIRSTCMD, ID_LASTCMD, CMF_EXPLORE | cmf);
958 if (hr > 0)
959 _InsertMenuItemW(hMenu, 0, TRUE, 0, MFT_SEPARATOR, NULL, 0);
960 _InsertMenuItemW(hMenu, 0, TRUE, IDC_TOGGLE, MFT_STRING,
962 MFS_DEFAULT | (tvi.cChildren ? 0 : MFS_GRAYED));
963
964 UINT cmd = TrackPopupMenuEx(hMenu, TPM_RETURNCMD, ici.ptInvoke.x, ici.ptInvoke.y, info.hWnd, NULL);
965 ici.lpVerb = MAKEINTRESOURCEA(cmd - ID_FIRSTCMD);
966 if (cmd == IDC_TOGGLE)
967 {
968 TreeView_SelectItem(info.hwndTreeView, hSelected);
969 TreeView_Expand(info.hwndTreeView, hSelected, TVE_TOGGLE);
970 }
971 else if (cmd != 0 && GetDfmCmd(pcm, ici.lpVerb) == DFM_CMD_RENAME)
972 {
973 BrFolder_Rename(&info, hSelected);
974 }
975 else if (cmd != 0)
976 {
977 if (GetKeyState(VK_SHIFT) < 0)
978 ici.fMask |= CMIC_MASK_SHIFT_DOWN;
979 if (GetKeyState(VK_CONTROL) < 0)
980 ici.fMask |= CMIC_MASK_CONTROL_DOWN;
981 pcm->InvokeCommand((CMINVOKECOMMANDINFO*)&ici);
982 }
983 info.pContextMenu = NULL;
984 DestroyMenu(hMenu);
985}
986
987static BOOL
989{
990 if (_ILIsDesktop(pidlSelection))
991 {
992 if (phItem)
993 *phItem = TVI_ROOT;
994 return TRUE;
995 }
996
997 // Move pidlCurrent behind the SHITEMIDs in pidlSelection, which are the root of
998 // the sub-tree currently displayed.
999 PCIDLIST_ABSOLUTE pidlRoot = info->lpBrowseInfo->pidlRoot;
1000 LPITEMIDLIST pidlCurrent = pidlSelection;
1001 while (!_ILIsEmpty(pidlRoot) && _ILIsEqualSimple(pidlRoot, pidlCurrent))
1002 {
1003 pidlRoot = ILGetNext(pidlRoot);
1004 pidlCurrent = ILGetNext(pidlCurrent);
1005 }
1006
1007 // The given ID List is not part of the SHBrowseForFolder's current sub-tree.
1008 if (!_ILIsEmpty(pidlRoot))
1009 {
1010 if (phItem)
1011 *phItem = NULL;
1012 return FALSE;
1013 }
1014
1015 // Initialize item to point to the first child of the root folder.
1017 item.hItem = TreeView_GetRoot(info->hwndTreeView);
1018 if (item.hItem)
1019 item.hItem = TreeView_GetChild(info->hwndTreeView, item.hItem);
1020
1021 // Walk the tree along the nodes corresponding to the remaining ITEMIDLIST
1022 while (item.hItem && !_ILIsEmpty(pidlCurrent))
1023 {
1024 TreeView_GetItem(info->hwndTreeView, &item);
1025 BrItemData *pItemData = (BrItemData *)item.lParam;
1026
1027 if (_ILIsEqualSimple(pItemData->pidlChild, pidlCurrent))
1028 {
1029 pidlCurrent = ILGetNext(pidlCurrent);
1030 if (!_ILIsEmpty(pidlCurrent))
1031 {
1032 // Only expand current node and move on to its first child,
1033 // if we didn't already reach the last SHITEMID
1034 TreeView_Expand(info->hwndTreeView, item.hItem, TVE_EXPAND);
1035 item.hItem = TreeView_GetChild(info->hwndTreeView, item.hItem);
1036 }
1037 }
1038 else
1039 {
1040 item.hItem = TreeView_GetNextSibling(info->hwndTreeView, item.hItem);
1041 }
1042 }
1043
1044 if (phItem)
1045 *phItem = item.hItem;
1046
1047 return (_ILIsEmpty(pidlCurrent) && item.hItem);
1048}
1049
1050static BOOL
1052{
1053 CComPtr<IShellFolder> psfDesktop;
1054 HRESULT hr = SHGetDesktopFolder(&psfDesktop);
1056 return FALSE;
1057
1059 hr = psfDesktop->ParseDisplayName(NULL, NULL, pszString, NULL, &pidlSelection, NULL);
1061 return FALSE;
1062
1063 return BrFolder_OnSetExpandedPidl(info, pidlSelection, phItem);
1064}
1065
1066static BOOL
1068{
1069 if (!pidlSelection)
1070 return FALSE;
1071
1073 BOOL ret = BrFolder_OnSetExpandedPidl(info, pidlSelection, &hItem);
1074 if (ret)
1075 TreeView_SelectItem(info->hwndTreeView, hItem);
1076 return ret;
1077}
1078
1079static BOOL
1081{
1082 if (!pszSelection)
1083 return FALSE;
1084
1086 BOOL ret = BrFolder_OnSetExpandedString(info, pszSelection, &hItem);
1087 if (ret)
1088 TreeView_SelectItem(info->hwndTreeView, hItem);
1089 return ret;
1090}
1091
1092static BOOL
1094{
1095 if (!pszSelectionA)
1096 return FALSE;
1097
1098 CComHeapPtr<WCHAR> pszSelectionW;
1099 __SHCloneStrAtoW(&pszSelectionW, pszSelectionA);
1100 if (!pszSelectionW)
1101 return FALSE;
1102
1103 return BrFolder_OnSetSelectionW(info, pszSelectionW);
1104}
1105
1106static void
1108{
1109 if (info->layout)
1110 {
1111 LayoutDestroy(info->layout);
1112 info->layout = NULL;
1113 }
1114
1115 SHChangeNotifyDeregister(info->hChangeNotify);
1116}
1117
1118static void
1121 _In_ HTREEITEM hTarget)
1122{
1123 // Get enum
1125 BrItemData *pItemData = BrFolder_GetItemData(info, hTarget);
1126 HRESULT hrEnum = BrFolder_GetChildrenEnum(info, pItemData, &pEnum);
1127
1128 // Insert new items
1129 if (SUCCEEDED(hrEnum))
1130 {
1132 while (S_OK == pEnum->Next(1, &pidlTemp, NULL))
1133 {
1134 if (!BrFolder_TreeItemHasThisChild(info, hTarget, pidlTemp))
1135 {
1136 BrFolder_InsertItem(info, pItemData->lpsfParent, pidlTemp, pItemData->pidlFull,
1137 hTarget);
1138 }
1139 pidlTemp.Free();
1140 }
1141 }
1142
1143 // Delete zombie items and update items
1144 HTREEITEM hItem, hNextItem;
1145 for (hItem = TreeView_GetChild(info->hwndTreeView, hTarget); hItem; hItem = hNextItem)
1146 {
1147 hNextItem = TreeView_GetNextSibling(info->hwndTreeView, hItem);
1148
1149 if (FAILED(hrEnum) || !BrFolder_IsTreeItemInEnum(info, hItem, pEnum))
1150 {
1151 TreeView_DeleteItem(info->hwndTreeView, hItem);
1152 hNextItem = TreeView_GetChild(info->hwndTreeView, hTarget);
1153 continue;
1154 }
1155
1158 }
1159
1160 if (SUCCEEDED(hrEnum))
1161 TreeView_SortChildren(info->hwndTreeView, hTarget, FALSE);
1162}
1163
1164static void
1166{
1167 HTREEITEM hRoot = TreeView_GetRoot(info->hwndTreeView);
1168
1169 SendMessageW(info->hwndTreeView, WM_SETREDRAW, FALSE, 0);
1170
1172
1173 SendMessageW(info->hwndTreeView, WM_SETREDRAW, TRUE, 0);
1174 InvalidateRect(info->hwndTreeView, NULL, TRUE);
1175}
1176
1177static void
1180 _In_ PCIDLIST_ABSOLUTE pidl0,
1181 _In_ PCIDLIST_ABSOLUTE pidl1,
1182 _In_ LONG event)
1183{
1184 TRACE("(%p)->(%p, %p, 0x%lX)\n", info, pidl0, pidl1, event);
1185
1186 switch (event)
1187 {
1188 case SHCNE_DRIVEADD:
1189 case SHCNE_MKDIR:
1190 case SHCNE_CREATE:
1191 case SHCNE_DRIVEREMOVED:
1192 case SHCNE_RMDIR:
1193 case SHCNE_DELETE:
1194 case SHCNE_RENAMEFOLDER:
1195 case SHCNE_RENAMEITEM:
1196 case SHCNE_UPDATEDIR:
1197 case SHCNE_UPDATEITEM:
1198 {
1199 // FIXME: Avoid full refresh and optimize for speed. Use pidl0 and pidl1
1201 break;
1202 }
1203 }
1204}
1205
1206// SHV_CHANGE_NOTIFY
1207static void
1209{
1210 // We use SHCNRF_NewDelivery method
1211 HANDLE hChange = (HANDLE)wParam;
1212 DWORD dwProcID = (DWORD)lParam;
1213
1214 PIDLIST_ABSOLUTE *ppidl = NULL;
1215 LONG event;
1216 HANDLE hLock = SHChangeNotification_Lock(hChange, dwProcID, &ppidl, &event);
1217 if (hLock == NULL)
1218 {
1219 ERR("hLock == NULL\n");
1220 return;
1221 }
1222
1223 BrFolder_OnChangeEx(info, ppidl[0], ppidl[1], (event & ~SHCNE_INTERRUPT));
1224
1226}
1227
1228/*************************************************************************
1229 * BrFolderDlgProc32 (not an exported API function)
1230 */
1231static INT_PTR CALLBACK
1233{
1234 if (uMsg == WM_INITDIALOG)
1236
1238 if (!info)
1239 return 0;
1240
1241 if (info->pContextMenu)
1242 {
1244 if (SHForwardContextMenuMsg(info->pContextMenu, uMsg, wParam,
1245 lParam, &result, TRUE) == S_OK)
1246 {
1248 return TRUE;
1249 }
1250 }
1251
1252 switch (uMsg)
1253 {
1254 case WM_NOTIFY:
1256 return TRUE;
1257
1258 case WM_COMMAND:
1260 break;
1261
1262 case WM_CONTEXTMENU:
1263 if (info->hwndTreeView == (HWND)wParam)
1265 break;
1266
1267 case WM_GETMINMAXINFO:
1268 ((LPMINMAXINFO)lParam)->ptMinTrackSize.x = info->szMin.cx;
1269 ((LPMINMAXINFO)lParam)->ptMinTrackSize.y = info->szMin.cy;
1270 break;
1271
1272 case WM_SIZE:
1273 if (info->layout) // New style dialogs
1275 break;
1276
1279 break;
1280
1283 break;
1284
1285 case BFFM_ENABLEOK:
1287 break;
1288
1289 case BFFM_SETOKTEXT: // Unicode only
1291 break;
1292
1293 case BFFM_SETSELECTIONA:
1294 if (wParam) // String
1296 else // PIDL
1298
1299 case BFFM_SETSELECTIONW:
1300 if (wParam) // String
1302 else // PIDL
1304
1305 case BFFM_SETEXPANDED: // Unicode only
1306 if (wParam) // String
1308 else // PIDL
1310
1311 case SHV_CHANGE_NOTIFY:
1313 break;
1314
1315 case WM_DESTROY:
1317 break;
1318 }
1319
1320 return 0;
1321}
1322
1323/*************************************************************************
1324 * SHBrowseForFolderA [SHELL32.@]
1325 * SHBrowseForFolder [SHELL32.@]
1326 */
1330{
1331 BROWSEINFOW bi;
1332 bi.hwndOwner = lpbi->hwndOwner;
1333 bi.pidlRoot = lpbi->pidlRoot;
1334
1336 bi.pszDisplayName = (lpbi->pszDisplayName ? szName : NULL);
1337
1338 CComHeapPtr<WCHAR> pszTitle;
1339 if (lpbi->lpszTitle)
1340 __SHCloneStrAtoW(&pszTitle, lpbi->lpszTitle);
1341 bi.lpszTitle = pszTitle;
1342
1343 bi.ulFlags = lpbi->ulFlags;
1344 bi.lpfn = lpbi->lpfn;
1345 bi.lParam = lpbi->lParam;
1346 bi.iImage = lpbi->iImage;
1348
1349 if (bi.pszDisplayName)
1351
1352 lpbi->iImage = bi.iImage;
1353 return pidl;
1354}
1355
1356/*************************************************************************
1357 * SHBrowseForFolderW [SHELL32.@]
1358 */
1362{
1363 TRACE("%p\n", lpbi);
1364
1365 BrFolder info = { lpbi };
1366
1368
1372 if (SUCCEEDED(hr))
1374
1375 if (ret != IDOK)
1376 {
1377 ILFree(info.pidlRet);
1378 return NULL;
1379 }
1380
1381 return info.pidlRet;
1382}
BOOL _ILIsDesktop(LPCITEMIDLIST pidl)
Definition: CBandSite.h:24
HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
#define shell32_hInstance
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 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:573
static void BrFolder_OnContextMenu(BrFolder &info, LPARAM lParam)
Definition: brfolder.cpp:918
static void BrFolder_OnChange(BrFolder *info, WPARAM wParam, LPARAM lParam)
Definition: brfolder.cpp:1208
static BOOL BrFolder_OnSetSelectionPidl(BrFolder *info, LPITEMIDLIST pidlSelection)
Definition: brfolder.cpp:1067
static void GetTreeViewItemContextMenuPos(HWND hWnd, HTREEITEM hItem, POINT *ppt)
Definition: brfolder.cpp:906
EXTERN_C LPITEMIDLIST WINAPI SHBrowseForFolderW(LPBROWSEINFOW lpbi)
Definition: brfolder.cpp:1361
static HRESULT BrFolder_NewFolder(BrFolder *info)
Definition: brfolder.cpp:777
static void BrFolder_Callback(LPBROWSEINFOW lpBrowseInfo, HWND hWnd, UINT uMsg, LPARAM lParam)
Definition: brfolder.cpp:68
static void BrFolder_OnChangeEx(_Inout_ BrFolder *info, _In_ PCIDLIST_ABSOLUTE pidl0, _In_ PCIDLIST_ABSOLUTE pidl1, _In_ LONG event)
Definition: brfolder.cpp:1178
static BOOL BrFolder_OnSetSelectionW(BrFolder *info, LPWSTR pszSelection)
Definition: brfolder.cpp:1080
static INT_PTR CALLBACK BrFolderDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: brfolder.cpp:1232
static const LAYOUT_INFO g_layout_info[]
Definition: brfolder.cpp:38
static void BrFolder_Refresh(_Inout_ BrFolder *info)
Definition: brfolder.cpp:1165
#define SHV_CHANGE_NOTIFY
Definition: brfolder.cpp:17
static LRESULT BrFolder_Treeview_Expand(BrFolder *info, NMTREEVIEWW *pnmtv)
Definition: brfolder.cpp:485
static BOOL BrFolder_IsTreeItemInEnum(_Inout_ BrFolder *info, _In_ HTREEITEM hItem, _Inout_ IEnumIDList *pEnum)
Definition: brfolder.cpp:258
static BOOL PIDLIsType(LPCITEMIDLIST pidl, PIDLTYPE type)
Definition: brfolder.cpp:428
#define SUPPORTED_FLAGS
Definition: brfolder.cpp:49
static SFGAOF BrFolder_GetItemAttributes(BrFolder *info, HTREEITEM hItem, SFGAOF Att)
Definition: brfolder.cpp:89
static BrItemData * BrFolder_GetItemData(BrFolder *info, HTREEITEM hItem)
Definition: brfolder.cpp:76
static void BrFolder_Delete(BrFolder *info, HTREEITEM hItem)
Definition: brfolder.cpp:581
static void BrFolder_RefreshRecurse(_Inout_ BrFolder *info, _In_ HTREEITEM hTarget)
Definition: brfolder.cpp:1119
static HRESULT BrFolder_GetChildrenEnum(_In_ BrFolder *info, _In_ BrItemData *pItemData, _Outptr_opt_ IEnumIDList **ppEnum)
Definition: brfolder.cpp:97
static HRESULT BrFolder_Treeview_Changed(BrFolder *info, NMTREEVIEWW *pnmtv)
Definition: brfolder.cpp:519
static void BrFolder_GetIconPair(PCIDLIST_ABSOLUTE pidl, LPTVITEMW pItem)
Definition: brfolder.cpp:206
static INT BrFolder_GetIcon(PCIDLIST_ABSOLUTE pidl, UINT uFlags)
Definition: brfolder.cpp:198
static DWORD BrowseFlagsToSHCONTF(UINT ulFlags)
Definition: brfolder.cpp:62
static LRESULT BrFolder_Treeview_Keydown(BrFolder *info, LPNMTVKEYDOWN keydown)
Definition: brfolder.cpp:608
static HTREEITEM BrFolder_InsertItem(_Inout_ BrFolder *info, _Inout_ IShellFolder *lpsf, _In_ PCUITEMID_CHILD pidlChild, _In_ PCIDLIST_ABSOLUTE pidlParent, _In_ HTREEITEM hParent)
Definition: brfolder.cpp:339
static void BrFolder_OnOK(BrFolder *info)
Definition: brfolder.cpp:850
static LRESULT BrFolder_OnNotify(BrFolder *info, UINT CtlID, LPNMHDR lpnmh)
Definition: brfolder.cpp:640
static void BrFolder_UpdateItem(_In_ BrFolder *info, _In_ HTREEITEM hItem)
Definition: brfolder.cpp:299
static void BrFolder_InitTreeView(BrFolder *info)
Definition: brfolder.cpp:144
static void BrFolder_CheckValidSelection(BrFolder *info, BrItemData *pItemData)
Definition: brfolder.cpp:437
EXTERN_C LPITEMIDLIST WINAPI SHBrowseForFolderA(LPBROWSEINFOA lpbi)
Definition: brfolder.cpp:1329
static BOOL BrFolder_OnSetSelectionA(BrFolder *info, LPSTR pszSelectionA)
Definition: brfolder.cpp:1093
static BOOL BrFolder_TreeItemHasThisChild(_In_ BrFolder *info, _In_ HTREEITEM hItem, _Outptr_opt_ PITEMID_CHILD pidlChild)
Definition: brfolder.cpp:282
static BOOL BrFolder_OnInitDialog(HWND hWnd, BrFolder *info)
Definition: brfolder.cpp:686
static BOOL BrFolder_OnSetExpandedString(BrFolder *info, LPWSTR pszString, HTREEITEM *phItem)
Definition: brfolder.cpp:1051
static void BrFolder_OnCommand(BrFolder *info, UINT id)
Definition: brfolder.cpp:882
static void BrFolder_Expand(_In_ BrFolder *info, _In_ IShellFolder *lpsf, _In_ PCIDLIST_ABSOLUTE pidlFull, _In_ HTREEITEM hParent)
Definition: brfolder.cpp:396
static BOOL BrFolder_OnSetExpandedPidl(BrFolder *info, LPITEMIDLIST pidlSelection, HTREEITEM *phItem)
Definition: brfolder.cpp:988
static LRESULT BrFolder_Treeview_Rename(BrFolder *info, NMTVDISPINFOW *pnmtv)
Definition: brfolder.cpp:536
static LRESULT BrFolder_Treeview_Delete(BrFolder *info, NMTREEVIEWW *pnmtv)
Definition: brfolder.cpp:474
static BOOL BrFolder_GetName(IShellFolder *lpsf, PCIDLIST_RELATIVE pidlChild, DWORD dwFlags, LPWSTR lpFriendlyName)
Definition: brfolder.cpp:240
static void BrFolder_OnDestroy(BrFolder *info)
Definition: brfolder.cpp:1107
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
void Free()
Definition: atlalloc.h:153
void Attach(T *lp)
Definition: atlalloc.h:162
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define E_FAIL
Definition: ddrawi.h:102
void pdump(LPCITEMIDLIST pidl)
Definition: debughlp.cpp:311
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
UINT uFlags
Definition: api.c:59
#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
HRESULT WINAPI DECLSPEC_HOTPATCH OleInitialize(LPVOID reserved)
Definition: ole2.c:169
void WINAPI DECLSPEC_HOTPATCH OleUninitialize(void)
Definition: ole2.c:230
DWORD SHGetAttributes(_In_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_ DWORD dwAttributes)
Definition: utils.cpp:246
UINT GetDfmCmd(_In_ IContextMenu *pCM, _In_ LPCSTR verba)
Definition: utils.cpp:1376
HRESULT SHILAppend(_Inout_ LPITEMIDLIST pidl, _Inout_ LPITEMIDLIST *ppidl)
Definition: utils.cpp:73
HRESULT SHILClone(_In_opt_ LPCITEMIDLIST pidl, _Outptr_ LPITEMIDLIST *ppidl)
Definition: utils.cpp:13
HRESULT WINAPI SHGetFolderLocation(HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwReserved, LPITEMIDLIST *ppidl)
Definition: shellpath.c:3150
HRESULT WINAPI SHGetFolderPathW(HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwFlags, LPWSTR pszPath)
Definition: shellpath.c:2589
BOOL WINAPI PathYetAnotherMakeUniqueName(LPWSTR buffer, LPCWSTR path, LPCWSTR shortname, LPCWSTR longname)
Definition: shellpath.c:699
BOOL WINAPI PathIsDirectoryW(LPCWSTR lpszPath)
Definition: path.c:1723
BOOL WINAPI PathIsRelativeW(LPCWSTR lpszPath)
Definition: path.c:1579
INT WINAPI SHUnicodeToAnsi(LPCWSTR lpSrcStr, LPSTR lpDstStr, INT iLen)
Definition: string.c:2791
BOOL WINAPI StrTrimW(LPWSTR lpszStr, LPCWSTR lpszTrim)
Definition: string.c:1877
static BOOLEAN bSuccess
Definition: drive.cpp:477
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
FxCollectionEntry * cur
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
GLenum GLsizei len
Definition: glext.h:6722
GLuint64EXT * result
Definition: glext.h:11304
BOOL WINAPI Shell_GetImageLists(HIMAGELIST *lpBigList, HIMAGELIST *lpSmallList)
Definition: iconcache.cpp:683
HRESULT BindToObject([in] PCUIDLIST_RELATIVE pidl, [in] LPBC pbcReserved, [in] REFIID riid, [out, iid_is(riid)] void **ppvOut)
HRESULT GetDisplayNameOf([in] PCUITEMID_CHILD pidl, [in] SHGDNF uFlags, [out] STRRET *lpName)
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 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
#define _Inout_
Definition: ms_sal.h:378
#define _Outptr_opt_
Definition: ms_sal.h:429
#define _In_
Definition: ms_sal.h:308
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
unsigned int UINT
Definition: ndis.h:50
#define DWORD
Definition: nt_native.h:44
#define UNICODE_NULL
#define L(x)
Definition: ntvdm.h:50
long LONG
Definition: pedump.c:60
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:237
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:946
LPITEMIDLIST WINAPI ILFindLastID(LPCITEMIDLIST pidl)
Definition: pidl.c:198
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:718
LPITEMIDLIST _ILCreateDesktop(void)
Definition: pidl.c:1641
LPPIDLDATA _ILGetDataPointer(LPCITEMIDLIST pidl)
Definition: pidl.c:2160
BOOL WINAPI ILRemoveLastID(LPITEMIDLIST pidl)
Definition: pidl.c:221
BOOL _ILIsMyComputer(LPCITEMIDLIST pidl)
Definition: pidl.c:1976
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
Definition: pidl.c:1348
LPITEMIDLIST WINAPI ILGetNext(LPCITEMIDLIST pidl)
Definition: pidl.c:872
LPITEMIDLIST WINAPI ILCreateFromPathW(LPCWSTR path)
Definition: pidl.c:1003
BOOL WINAPI ILIsEqual(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:548
BYTE PIDLTYPE
Definition: pidl.h:120
static BOOL _ILIsEqualSimple(LPCITEMIDLIST pidlA, LPCITEMIDLIST pidlB)
Definition: pidl.h:261
#define PT_COMP
Definition: pidl.h:99
static BOOL _ILIsEmpty(LPCITEMIDLIST pidl)
Definition: pidl.h:267
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 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_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
#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
DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path, DWORD dwFileAttributes, SHFILEINFOW *psfi, UINT sizeofpsfi, UINT flags)
Definition: shell32_main.c:414
static __inline LPWSTR __SHCloneStrAtoW(WCHAR **target, const char *source)
Definition: shell32_main.h:168
#define SHGFI_OPENICON
Definition: shellapi.h:178
#define SHGFI_SYSICONINDEX
Definition: shellapi.h:171
#define SHGFI_DISPLAYNAME
Definition: shellapi.h:166
#define FOF_ALLOWUNDO
Definition: shellapi.h:147
#define FO_DELETE
Definition: shellapi.h:138
#define SHGFI_SMALLICON
Definition: shellapi.h:176
#define SHGFI_PIDL
Definition: shellapi.h:180
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)
int WINAPI SHFileOperationW(LPSHFILEOPSTRUCTW lpFileOp)
Definition: shlfileop.cpp:1991
HRESULT hr
Definition: shlfolder.c:183
#define BIF_STATUSTEXT
Definition: shlobj.h:1219
#define SHCNE_DRIVEREMOVED
Definition: shlobj.h:1897
#define BFFM_SETOKTEXT
Definition: shlobj.h:1248
#define CSIDL_DESKTOPDIRECTORY
Definition: shlobj.h:2188
#define BFFM_SELCHANGED
Definition: shlobj.h:1237
#define SHCNE_RMDIR
Definition: shlobj.h:1894
#define BIF_RETURNONLYFSDIRS
Definition: shlobj.h:1217
#define SHCNE_DELETE
Definition: shlobj.h:1892
#define SHCNE_MKDIR
Definition: shlobj.h:1893
@ SHGFP_TYPE_CURRENT
Definition: shlobj.h:2149
#define BIF_RETURNFSANCESTORS
Definition: shlobj.h:1220
#define SHCNE_UPDATEITEM
Definition: shlobj.h:1903
#define BFFM_SETEXPANDED
Definition: shlobj.h:1249
#define SHCNE_RENAMEITEM
Definition: shlobj.h:1890
#define SHCNE_UPDATEDIR
Definition: shlobj.h:1902
#define BFFM_ENABLEOK
Definition: shlobj.h:1244
#define SHCNE_CREATE
Definition: shlobj.h:1891
#define SHCNE_RENAMEFOLDER
Definition: shlobj.h:1907
#define BIF_USENEWUI
Definition: shlobj.h:1224
#define SHCNRF_NewDelivery
Definition: shlobj.h:1938
#define SHCNRF_ShellLevel
Definition: shlobj.h:1936
#define BFFM_SETSELECTIONW
Definition: shlobj.h:1246
#define BIF_BROWSEINCLUDEFILES
Definition: shlobj.h:1232
#define SHCNE_DRIVEADD
Definition: shlobj.h:1898
#define BFFM_SETSTATUSTEXTW
Definition: shlobj.h:1247
#define CSIDL_DESKTOP
Definition: shlobj.h:2173
#define BFFM_INITIALIZED
Definition: shlobj.h:1236
#define SHCNE_ALLEVENTS
Definition: shlobj.h:1914
#define BFFM_SETSTATUSTEXTA
Definition: shlobj.h:1243
#define BIF_NONEWFOLDERBUTTON
Definition: shlobj.h:1227
#define DFM_CMD_RENAME
Definition: shlobj.h:2620
#define BIF_NEWDIALOGSTYLE
Definition: shlobj.h:1223
#define SHCNE_INTERRUPT
Definition: shlobj.h:1915
#define BIF_EDITBOX
Definition: shlobj.h:1221
#define BIF_BROWSEFORCOMPUTER
Definition: shlobj.h:1230
#define BFFM_SETSELECTIONA
Definition: shlobj.h:1245
HRESULT WINAPI SHAutoComplete(HWND hwndEdit, DWORD dwFlags)
Definition: autocomp.cpp:191
#define SHACF_FILESYSTEM
Definition: shlwapi.h:1940
#define SHACF_URLHISTORY
Definition: shlwapi.h:1941
#define SHACF_FILESYS_ONLY
Definition: shlwapi.h:1945
#define IDD_BROWSE_FOR_FOLDER_NEW
Definition: shresdef.h:434
#define IDC_BROWSE_FOR_FOLDER_FOLDER_TEXT
Definition: shresdef.h:436
#define IDC_BROWSE_FOR_FOLDER_TREEVIEW
Definition: shresdef.h:440
#define IDC_BROWSE_FOR_FOLDER_NEW_FOLDER
Definition: shresdef.h:435
#define IDD_BROWSE_FOR_FOLDER
Definition: shresdef.h:433
#define IDC_BROWSE_FOR_FOLDER_STATUS
Definition: shresdef.h:438
#define IDC_BROWSE_FOR_FOLDER_TITLE
Definition: shresdef.h:439
#define IDC_BROWSE_FOR_FOLDER_FOLDER
Definition: shresdef.h:437
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:27
IContextMenu * pContextMenu
Definition: brfolder.cpp:28
HWND hWnd
Definition: brfolder.cpp:22
LPBROWSEINFOW lpBrowseInfo
Definition: brfolder.cpp:21
LAYOUT_DATA * layout
Definition: brfolder.cpp:25
PIDLIST_ABSOLUTE pidlRet
Definition: brfolder.cpp:24
SIZE szMin
Definition: brfolder.cpp:26
HWND hwndTreeView
Definition: brfolder.cpp:23
PCIDLIST_RELATIVE pidlChild
Definition: brfolder.cpp:34
CComHeapPtr< ITEMIDLIST_ABSOLUTE > pidlFull
Definition: brfolder.cpp:35
CComPtr< IShellFolder > lpsfParent
Definition: brfolder.cpp:33
PCIDLIST_ABSOLUTE pidl
Definition: shlobj.h:1886
WCHAR szDisplayName[MAX_PATH]
Definition: shellapi.h:375
LPCWSTR pFrom
Definition: shellapi.h:357
FILEOP_FLAGS fFlags
Definition: shellapi.h:359
Definition: ftp_var.h:139
Definition: name.c:39
LPCSTR lpszTitle
Definition: shlobj.h:1192
PCIDLIST_ABSOLUTE pidlRoot
Definition: shlobj.h:1190
BFFCALLBACK lpfn
Definition: shlobj.h:1194
HWND hwndOwner
Definition: shlobj.h:1189
LPSTR pszDisplayName
Definition: shlobj.h:1191
UINT ulFlags
Definition: shlobj.h:1193
LPARAM lParam
Definition: shlobj.h:1195
BFFCALLBACK lpfn
Definition: shlobj.h:1205
PCIDLIST_ABSOLUTE pidlRoot
Definition: shlobj.h:1201
UINT ulFlags
Definition: shlobj.h:1204
LPWSTR pszDisplayName
Definition: shlobj.h:1202
HWND hwndOwner
Definition: shlobj.h:1200
LPCWSTR lpszTitle
Definition: shlobj.h:1203
LPARAM lParam
Definition: shlobj.h:1206
UINT_PTR idFrom
Definition: winuser.h:3161
UINT code
Definition: winuser.h:3162
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
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
int32_t INT_PTR
Definition: typedefs.h:64
PVOID HANDLE
Definition: typedefs.h:73
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
_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
HWND WINAPI SetCapture(_In_ HWND hWnd)
HMENU WINAPI CreatePopupMenu(void)
Definition: menu.c:838
#define SW_HIDE
Definition: winuser.h:771
#define DWLP_USER
Definition: winuser.h:875
#define GetWindowLongPtrW
Definition: winuser.h:4832
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
BOOL WINAPI ReleaseCapture(void)
Definition: message.c:2890
#define IDCANCEL
Definition: winuser.h:834
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:1614
#define WM_COMMAND
Definition: winuser.h:1743
#define BF_LEFT
Definition: winuser.h:454
#define IDC_ARROW
Definition: winuser.h:687
#define VK_CONTROL
Definition: winuser.h:2206
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:1742
#define MFT_SEPARATOR
Definition: winuser.h:747
HCURSOR WINAPI LoadCursorW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
Definition: cursoricon.c:2157
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:833
#define MFS_DEFAULT
Definition: winuser.h:751
#define WM_GETMINMAXINFO
Definition: winuser.h:1643
#define VK_F5
Definition: winuser.h:2262
#define MFS_GRAYED
Definition: winuser.h:754
#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:873
#define IDC_WAIT
Definition: winuser.h:689
struct tagMINMAXINFO * LPMINMAXINFO
#define VK_SHIFT
Definition: winuser.h:2205
#define MFT_STRING
Definition: winuser.h:749
#define SW_SHOW
Definition: winuser.h:778
#define VK_DELETE
Definition: winuser.h:2236
#define WM_DESTROY
Definition: winuser.h:1612
BOOL WINAPI InvalidateRect(_In_opt_ HWND, _In_opt_ LPCRECT, _In_ BOOL)
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
#define TPM_RETURNCMD
Definition: winuser.h:2390
#define SetWindowLongPtrW
Definition: winuser.h:5358
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:1619
BOOL WINAPI ScreenToClient(_In_ HWND, _Inout_ LPPOINT)
#define VK_F2
Definition: winuser.h:2259
#define IID_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