ReactOS 0.4.16-dev-598-gc07fba4
brfolder.cpp File Reference
#include "precomp.h"
#include <ui/layout.h>
#include <compat_undoc.h>
Include dependency graph for brfolder.cpp:

Go to the source code of this file.

Classes

struct  BrFolder
 
struct  BrItemData
 

Macros

#define SHV_CHANGE_NOTIFY   (WM_USER + 0x1111)
 
#define SUPPORTED_FLAGS
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (shell)
 
static LPITEMIDLIST ILCloneToDepth (LPCITEMIDLIST pidlSrc, UINT depth)
 
static INT GetIconIndex (PCIDLIST_ABSOLUTE pidl, UINT uFlags)
 
static HTREEITEM BrFolder_InsertItem (_Inout_ BrFolder *info, _Inout_ IShellFolder *lpsf, _In_ PCUITEMID_CHILD pidlChild, _In_ PCIDLIST_ABSOLUTE pidlParent, _In_ HTREEITEM hParent)
 
static DWORD BrowseFlagsToSHCONTF (UINT ulFlags)
 
static void BrFolder_Callback (LPBROWSEINFOW lpBrowseInfo, HWND hWnd, UINT uMsg, LPARAM lParam)
 
static BrItemDataBrFolder_GetItemData (BrFolder *info, HTREEITEM hItem)
 
static SFGAOF BrFolder_GetItemAttributes (BrFolder *info, HTREEITEM hItem, SFGAOF Att)
 
static HRESULT BrFolder_GetChildrenEnum (_In_ BrFolder *info, _In_ BrItemData *pItemData, _Outptr_opt_ IEnumIDList **ppEnum)
 
static void BrFolder_InitTreeView (BrFolder *info)
 
static void BrFolder_GetIconPair (PCIDLIST_ABSOLUTE pidl, LPTVITEMW pItem)
 
static BOOL BrFolder_GetName (IShellFolder *lpsf, PCIDLIST_RELATIVE pidlChild, DWORD dwFlags, LPWSTR lpFriendlyName)
 
static BOOL BrFolder_IsTreeItemInEnum (_Inout_ BrFolder *info, _In_ HTREEITEM hItem, _Inout_ IEnumIDList *pEnum)
 
static BOOL BrFolder_TreeItemHasThisChild (_In_ BrFolder *info, _In_ HTREEITEM hItem, _Outptr_opt_ PITEMID_CHILD pidlChild)
 
static void BrFolder_UpdateItem (_In_ BrFolder *info, _In_ HTREEITEM hItem)
 
static void BrFolder_Expand (_In_ BrFolder *info, _In_ IShellFolder *lpsf, _In_ PCIDLIST_ABSOLUTE pidlFull, _In_ HTREEITEM hParent)
 
static BOOL PIDLIsType (LPCITEMIDLIST pidl, PIDLTYPE type)
 
static void BrFolder_CheckValidSelection (BrFolder *info, BrItemData *pItemData)
 
static LRESULT BrFolder_Treeview_Delete (BrFolder *info, NMTREEVIEWW *pnmtv)
 
static LRESULT BrFolder_Treeview_Expand (BrFolder *info, NMTREEVIEWW *pnmtv)
 
static HRESULT BrFolder_Treeview_Changed (BrFolder *info, NMTREEVIEWW *pnmtv)
 
static LRESULT BrFolder_Treeview_Rename (BrFolder *info, NMTVDISPINFOW *pnmtv)
 
static HRESULT BrFolder_Rename (BrFolder *info, HTREEITEM hItem)
 
static void BrFolder_Delete (BrFolder *info, HTREEITEM hItem)
 
static void BrFolder_Refresh (_Inout_ BrFolder *info)
 
static LRESULT BrFolder_Treeview_Keydown (BrFolder *info, LPNMTVKEYDOWN keydown)
 
static LRESULT BrFolder_OnNotify (BrFolder *info, UINT CtlID, LPNMHDR lpnmh)
 
static BOOL BrFolder_OnInitDialog (HWND hWnd, BrFolder *info)
 
static HRESULT BrFolder_NewFolder (BrFolder *info)
 
static void BrFolder_OnOK (BrFolder *info)
 
static void BrFolder_OnCommand (BrFolder *info, UINT id)
 
static void GetTreeViewItemContextMenuPos (HWND hWnd, HTREEITEM hItem, POINT *ppt)
 
static void BrFolder_OnContextMenu (BrFolder &info, LPARAM lParam)
 
static BOOL BrFolder_ExpandToPidl (BrFolder *info, LPITEMIDLIST pidlSelection, HTREEITEM *phItem)
 
static BOOL BrFolder_ExpandToString (BrFolder *info, LPWSTR pszString, HTREEITEM *phItem)
 
static BOOL BrFolder_OnSetExpanded (BrFolder *info, LPITEMIDLIST pidlSelection, LPWSTR pszString)
 
static BOOL BrFolder_OnSetSelectionPidl (BrFolder *info, LPITEMIDLIST pidlSelection)
 
static BOOL BrFolder_OnSetSelectionW (BrFolder *info, LPWSTR pszSelection)
 
static BOOL BrFolder_OnSetSelectionA (BrFolder *info, LPSTR pszSelectionA)
 
static void BrFolder_OnDestroy (BrFolder *info)
 
static void BrFolder_RefreshRecurse (_Inout_ BrFolder *info, _In_ HTREEITEM hTarget)
 
static void BrFolder_OnChangeEx (_Inout_ BrFolder *info, _In_ PCIDLIST_ABSOLUTE pidl0, _In_ PCIDLIST_ABSOLUTE pidl1, _In_ LONG event)
 
static void BrFolder_OnChange (BrFolder *info, WPARAM wParam, LPARAM lParam)
 
static INT_PTR CALLBACK BrFolderDlgProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 
EXTERN_C LPITEMIDLIST WINAPI SHBrowseForFolderA (LPBROWSEINFOA lpbi)
 
EXTERN_C LPITEMIDLIST WINAPI SHBrowseForFolderW (LPBROWSEINFOW lpbi)
 

Variables

static const LAYOUT_INFO g_layout_info []
 

Macro Definition Documentation

◆ SHV_CHANGE_NOTIFY

#define SHV_CHANGE_NOTIFY   (WM_USER + 0x1111)

Definition at line 18 of file brfolder.cpp.

◆ SUPPORTED_FLAGS

#define SUPPORTED_FLAGS
Value:
#define BIF_STATUSTEXT
Definition: shlobj.h:1219
#define BIF_RETURNONLYFSDIRS
Definition: shlobj.h:1217
#define BIF_RETURNFSANCESTORS
Definition: shlobj.h:1220
#define BIF_BROWSEINCLUDEFILES
Definition: shlobj.h:1232
#define BIF_NONEWFOLDERBUTTON
Definition: shlobj.h:1227
#define BIF_NEWDIALOGSTYLE
Definition: shlobj.h:1223
#define BIF_BROWSEFORCOMPUTER
Definition: shlobj.h:1230

Definition at line 74 of file brfolder.cpp.

Function Documentation

◆ BrFolder_Callback()

static void BrFolder_Callback ( LPBROWSEINFOW  lpBrowseInfo,
HWND  hWnd,
UINT  uMsg,
LPARAM  lParam 
)
static

Definition at line 93 of file brfolder.cpp.

94{
95 if (!lpBrowseInfo->lpfn)
96 return;
97 lpBrowseInfo->lpfn(hWnd, uMsg, lParam, lpBrowseInfo->lParam);
98}
HWND hWnd
Definition: settings.c:17
LPARAM lParam
Definition: combotst.c:139
BFFCALLBACK lpfn
Definition: shlobj.h:1205
LPARAM lParam
Definition: shlobj.h:1206

Referenced by BrFolder_OnInitDialog(), and BrFolder_Treeview_Changed().

◆ BrFolder_CheckValidSelection()

static void BrFolder_CheckValidSelection ( BrFolder info,
BrItemData pItemData 
)
static

Definition at line 430 of file brfolder.cpp.

431{
432 LPBROWSEINFOW lpBrowseInfo = info->lpBrowseInfo;
433 PCIDLIST_RELATIVE pidlChild = pItemData->pidlChild;
435 HRESULT hr;
436
437 BOOL bEnabled = TRUE;
438 if ((lpBrowseInfo->ulFlags & BIF_BROWSEFORCOMPUTER) && !PIDLIsType(pidlChild, PT_COMP))
439 bEnabled = FALSE;
440
441 if (lpBrowseInfo->ulFlags & BIF_RETURNFSANCESTORS)
442 {
443 dwAttributes = SFGAO_FILESYSANCESTOR | SFGAO_FILESYSTEM;
444 hr = pItemData->lpsfParent->GetAttributesOf(1, &pidlChild, &dwAttributes);
445 if (FAILED(hr) || !(dwAttributes & (SFGAO_FILESYSANCESTOR | SFGAO_FILESYSTEM)))
446 bEnabled = FALSE;
447 }
448
449 dwAttributes = SFGAO_FOLDER | SFGAO_FILESYSTEM;
450 hr = pItemData->lpsfParent->GetAttributesOf(1, &pidlChild, &dwAttributes);
451 if (FAILED_UNEXPECTEDLY(hr) ||
452 ((dwAttributes & (SFGAO_FOLDER | SFGAO_FILESYSTEM)) != (SFGAO_FOLDER | SFGAO_FILESYSTEM)))
453 {
454 if (lpBrowseInfo->ulFlags & BIF_RETURNONLYFSDIRS)
455 bEnabled = FALSE;
457 }
458 else
459 {
461 }
462
463 SendMessageW(info->hWnd, BFFM_ENABLEOK, 0, bEnabled);
464}
static BOOL PIDLIsType(LPCITEMIDLIST pidl, PIDLTYPE type)
Definition: brfolder.cpp:421
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:121
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
#define FAILED(hr)
Definition: intsafe.h:51
#define PT_COMP
Definition: pidl.h:99
HRESULT hr
Definition: shlfolder.c:183
#define BFFM_ENABLEOK
Definition: shlobj.h:1244
#define IDC_BROWSE_FOR_FOLDER_NEW_FOLDER
Definition: shresdef.h:435
PCIDLIST_RELATIVE pidlChild
Definition: brfolder.cpp:59
CComPtr< IShellFolder > lpsfParent
Definition: brfolder.cpp:58
UINT ulFlags
Definition: shlobj.h:1204
DWORD dwAttributes
Definition: vdmdbg.h:34
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
BOOL WINAPI EnableWindow(_In_ HWND, _In_ BOOL)
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)

Referenced by BrFolder_Treeview_Changed().

◆ BrFolder_Delete()

static void BrFolder_Delete ( BrFolder info,
HTREEITEM  hItem 
)
static

Definition at line 574 of file brfolder.cpp.

575{
576 SHFILEOPSTRUCTW fileop = { info->hwndTreeView };
577 WCHAR szzFrom[MAX_PATH + 1];
578
579 // Get item_data
581
582 // Get the path
583 if (!SHGetPathFromIDListW(item_data->pidlFull, szzFrom))
584 {
585 ERR("SHGetPathFromIDListW failed\n");
586 return;
587 }
588 szzFrom[lstrlenW(szzFrom) + 1] = UNICODE_NULL; // Double NULL-terminated
589 fileop.pFrom = szzFrom;
590
591 // Delete folder
592 fileop.fFlags = FOF_ALLOWUNDO;
593 fileop.wFunc = FO_DELETE;
594 SHFileOperationW(&fileop);
595}
#define ERR(fmt,...)
Definition: precomp.h:57
static BrItemData * BrFolder_GetItemData(BrFolder *info, HTREEITEM hItem)
Definition: brfolder.cpp:101
#define MAX_PATH
Definition: compat.h:34
#define lstrlenW
Definition: compat.h:750
#define UNICODE_NULL
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
Definition: pidl.c:1454
#define FOF_ALLOWUNDO
Definition: shellapi.h:148
#define FO_DELETE
Definition: shellapi.h:139
int WINAPI SHFileOperationW(LPSHFILEOPSTRUCTW lpFileOp)
Definition: shlfileop.cpp:1990
CComHeapPtr< ITEMIDLIST_ABSOLUTE > pidlFull
Definition: brfolder.cpp:60
LPCWSTR pFrom
Definition: shellapi.h:358
FILEOP_FLAGS fFlags
Definition: shellapi.h:360
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by BrFolder_Treeview_Keydown().

◆ BrFolder_Expand()

static void BrFolder_Expand ( _In_ BrFolder info,
_In_ IShellFolder lpsf,
_In_ PCIDLIST_ABSOLUTE  pidlFull,
_In_ HTREEITEM  hParent 
)
static

Definition at line 389 of file brfolder.cpp.

394{
395 TRACE("%p %p %p\n", lpsf, pidlFull, hParent);
396
397 // No IEnumIDList -> No children
398 BrItemData *pItemData = BrFolder_GetItemData(info, hParent);
400 HRESULT hr = BrFolder_GetChildrenEnum(info, pItemData, &pEnum);
401 if (FAILED(hr))
402 return;
403
404 SetCapture(info->hWnd);
406
408 ULONG ulFetched;
409 while (S_OK == pEnum->Next(1, &pidlTemp, &ulFetched))
410 {
411 /* Ignore return value of BrFolder_InsertItem to avoid incomplete folder listing */
412 BrFolder_InsertItem(info, lpsf, pidlTemp, pidlFull, hParent);
413 pidlTemp.Free(); // Finally, free the pidl that the shell gave us...
414 }
415
418}
static HRESULT BrFolder_GetChildrenEnum(_In_ BrFolder *info, _In_ BrItemData *pItemData, _Outptr_opt_ IEnumIDList **ppEnum)
Definition: brfolder.cpp:122
static HTREEITEM BrFolder_InsertItem(_Inout_ BrFolder *info, _Inout_ IShellFolder *lpsf, _In_ PCUITEMID_CHILD pidlChild, _In_ PCIDLIST_ABSOLUTE pidlParent, _In_ HTREEITEM hParent)
Definition: brfolder.cpp:332
void Free()
Definition: atlalloc.h:153
#define NULL
Definition: types.h:112
#define S_OK
Definition: intsafe.h:52
#define TRACE(s)
Definition: solgame.cpp:4
uint32_t ULONG
Definition: typedefs.h:59
HWND WINAPI SetCapture(_In_ HWND hWnd)
BOOL WINAPI ReleaseCapture(void)
Definition: message.c:2890
#define IDC_ARROW
Definition: winuser.h:687
HCURSOR WINAPI SetCursor(_In_opt_ HCURSOR)
HCURSOR WINAPI LoadCursorW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
Definition: cursoricon.c:2191
#define IDC_WAIT
Definition: winuser.h:689
WCHAR * LPWSTR
Definition: xmlstorage.h:184

Referenced by BrFolder_Treeview_Expand().

◆ BrFolder_ExpandToPidl()

static BOOL BrFolder_ExpandToPidl ( BrFolder info,
LPITEMIDLIST  pidlSelection,
HTREEITEM phItem 
)
static

Definition at line 994 of file brfolder.cpp.

995{
996 LPITEMIDLIST pidlCurrent = pidlSelection;
997 if (_ILIsDesktop(pidlSelection))
998 {
999 if (phItem)
1000 *phItem = TVI_ROOT;
1001 return TRUE;
1002 }
1003
1004 // Initialize item to point to the first child of the root folder.
1006 item.hItem = TreeView_GetRoot(info->hwndTreeView);
1007 if (item.hItem)
1008 item.hItem = TreeView_GetChild(info->hwndTreeView, item.hItem);
1009
1010 // Walk the tree along the nodes corresponding to the remaining ITEMIDLIST
1011 UINT depth = _ILGetDepth(info->lpBrowseInfo->pidlRoot);
1012 while (item.hItem && pidlCurrent)
1013 {
1014 LPITEMIDLIST pidlNeedle = ILCloneToDepth(pidlSelection, ++depth);
1015 if (_ILIsEmpty(pidlNeedle))
1016 {
1017 ILFree(pidlNeedle);
1018 item.hItem = NULL; // Failure
1019 break;
1020 }
1021next:
1022 TreeView_GetItem(info->hwndTreeView, &item);
1023 const BrItemData *pItemData = (BrItemData *)item.lParam;
1024 if (ILIsEqual(pItemData->pidlFull, pidlNeedle))
1025 {
1026 BOOL done = _ILGetDepth(pidlSelection) == _ILGetDepth(pidlNeedle);
1027 if (done)
1028 {
1029 pidlCurrent = NULL; // Success
1030 }
1031 else
1032 {
1033 TreeView_Expand(info->hwndTreeView, item.hItem, TVE_EXPAND);
1034 item.hItem = TreeView_GetChild(info->hwndTreeView, item.hItem);
1035 }
1036 }
1037 else
1038 {
1039 item.hItem = TreeView_GetNextSibling(info->hwndTreeView, item.hItem);
1040 if (item.hItem)
1041 goto next;
1042 }
1043 ILFree(pidlNeedle);
1044 }
1045
1046 if (phItem)
1047 *phItem = item.hItem;
1048
1049 return (_ILIsEmpty(pidlCurrent) && item.hItem);
1050}
BOOL _ILIsDesktop(LPCITEMIDLIST pidl)
Definition: CBandSite.h:24
static LPITEMIDLIST ILCloneToDepth(LPCITEMIDLIST pidlSrc, UINT depth)
Definition: brfolder.cpp:21
GLint GLint GLsizei GLsizei GLsizei depth
Definition: gl.h:1546
if(dx< 0)
Definition: linetemp.h:194
static ATOM item
Definition: dde.c:856
unsigned int UINT
Definition: ndis.h:50
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:1044
BOOL WINAPI ILIsEqual(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:582
UINT _ILGetDepth(LPCITEMIDLIST pidl)
static BOOL _ILIsEmpty(LPCITEMIDLIST pidl)
Definition: pidl.h:260
#define TreeView_Expand(hwnd, hitem, code)
Definition: commctrl.h:3425
#define TreeView_GetChild(hwnd, hitem)
Definition: commctrl.h:3471
#define TreeView_GetItem(hwnd, pitem)
Definition: commctrl.h:3495
#define TVE_EXPAND
Definition: commctrl.h:3428
#define TVI_ROOT
Definition: commctrl.h:3373
#define TreeView_GetRoot(hwnd)
Definition: commctrl.h:3480
#define TreeView_GetNextSibling(hwnd, hitem)
Definition: commctrl.h:3472
#define TVIF_PARAM
Definition: commctrl.h:3273
static unsigned __int64 next
Definition: rand_nt.c:6
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41

Referenced by BrFolder_ExpandToString(), BrFolder_OnSetExpanded(), and BrFolder_OnSetSelectionPidl().

◆ BrFolder_ExpandToString()

static BOOL BrFolder_ExpandToString ( BrFolder info,
LPWSTR  pszString,
HTREEITEM phItem 
)
static

Definition at line 1053 of file brfolder.cpp.

1054{
1056 HRESULT hr = SHParseDisplayName(pszString, NULL, &pidlSelection, 0, NULL);
1057 return SUCCEEDED(hr) && BrFolder_ExpandToPidl(info, pidlSelection, phItem);
1058}
static BOOL BrFolder_ExpandToPidl(BrFolder *info, LPITEMIDLIST pidlSelection, HTREEITEM *phItem)
Definition: brfolder.cpp:994
#define SUCCEEDED(hr)
Definition: intsafe.h:50
HRESULT WINAPI SHParseDisplayName(LPCWSTR pszName, IBindCtx *pbc, LPITEMIDLIST *ppidl, SFGAOF sfgaoIn, SFGAOF *psfgaoOut)
Definition: pidl.c:1506
_In_ DWORD _In_ DWORD _Out_writes_to_opt_ pcchString LPSTR pszString
Definition: wincrypt.h:4505

Referenced by BrFolder_OnSetExpanded(), and BrFolder_OnSetSelectionW().

◆ BrFolder_GetChildrenEnum()

static HRESULT BrFolder_GetChildrenEnum ( _In_ BrFolder info,
_In_ BrItemData pItemData,
_Outptr_opt_ IEnumIDList **  ppEnum 
)
static

Definition at line 122 of file brfolder.cpp.

126{
127 if (!pItemData)
128 return E_FAIL;
129
130 CComPtr<IEnumIDList> pEnumIL;
131 PCUITEMID_CHILD pidlRef = pItemData->pidlChild;
132 ULONG attrs = SFGAO_HASSUBFOLDER | SFGAO_FOLDER;
133 IShellFolder *lpsf = pItemData->lpsfParent;
134 HRESULT hr = lpsf->GetAttributesOf(1, &pidlRef, &attrs);
135 if (FAILED_UNEXPECTEDLY(hr) || !(attrs & SFGAO_FOLDER))
136 return E_FAIL;
137
138 CComPtr<IShellFolder> psfChild;
139 if (_ILIsDesktop(pItemData->pidlFull))
140 hr = SHGetDesktopFolder(&psfChild);
141 else
142 hr = lpsf->BindToObject(pidlRef, NULL, IID_PPV_ARG(IShellFolder, &psfChild));
144 return E_FAIL;
145
146 DWORD flags = BrowseFlagsToSHCONTF(info->lpBrowseInfo->ulFlags);
147 hr = psfChild->EnumObjects(info->hWnd, flags, &pEnumIL);
148 if (hr == S_OK)
149 {
150 if ((pEnumIL->Skip(1) != S_OK) || FAILED(pEnumIL->Reset()))
151 pEnumIL = NULL;
152 }
153
154 if (!pEnumIL || !(attrs & SFGAO_HASSUBFOLDER))
155 return E_FAIL; // No children
156
157 if (ppEnum)
158 *ppEnum = pEnumIL.Detach();
159
160 return S_OK; // There are children
161}
HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
static DWORD BrowseFlagsToSHCONTF(UINT ulFlags)
Definition: brfolder.cpp:87
T * Detach()
Definition: atlcomcli.h:186
#define E_FAIL
Definition: ddrawi.h:102
GLbitfield flags
Definition: glext.h:7161
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)
const ITEMID_CHILD UNALIGNED * PCUITEMID_CHILD
Definition: shtypes.idl:70
#define IID_PPV_ARG(Itype, ppType)

Referenced by BrFolder_Expand(), BrFolder_InsertItem(), BrFolder_RefreshRecurse(), and BrFolder_UpdateItem().

◆ BrFolder_GetIconPair()

static void BrFolder_GetIconPair ( PCIDLIST_ABSOLUTE  pidl,
LPTVITEMW  pItem 
)
static

Definition at line 207 of file brfolder.cpp.

208{
209 static const ITEMIDLIST idlDesktop = { };
210 if (!pidl)
211 pidl = &idlDesktop;
213 pItem->iImage = GetIconIndex(pidl, flags);
215}
static INT GetIconIndex(PCIDLIST_ABSOLUTE pidl, UINT uFlags)
Definition: brfolder.cpp:37
#define SHGFI_OPENICON
Definition: shellapi.h:179
#define SHGFI_SYSICONINDEX
Definition: shellapi.h:172
#define SHGFI_SMALLICON
Definition: shellapi.h:177
#define SHGFI_PIDL
Definition: shellapi.h:181
int iImage
Definition: commctrl.h:3327
int iSelectedImage
Definition: commctrl.h:3328

Referenced by BrFolder_InsertItem(), and BrFolder_UpdateItem().

◆ BrFolder_GetItemAttributes()

static SFGAOF BrFolder_GetItemAttributes ( BrFolder info,
HTREEITEM  hItem,
SFGAOF  Att 
)
static

Definition at line 114 of file brfolder.cpp.

115{
117 HRESULT hr = item ? item->lpsfParent->GetAttributesOf(1, &item->pidlChild, &Att) : E_FAIL;
118 return SUCCEEDED(hr) ? Att : 0;
119}

Referenced by BrFolder_OnNotify(), and BrFolder_Treeview_Rename().

◆ BrFolder_GetItemData()

static BrItemData * BrFolder_GetItemData ( BrFolder info,
HTREEITEM  hItem 
)
static

Definition at line 101 of file brfolder.cpp.

102{
104 item.hItem = hItem;
105 if (!TreeView_GetItem(info->hwndTreeView, &item))
106 {
107 ERR("TreeView_GetItem failed\n");
108 return NULL;
109 }
110 return (BrItemData *)item.lParam;
111}
#define TVIF_HANDLE
Definition: commctrl.h:3275
HTREEITEM hItem
Definition: treelist.h:37

Referenced by BrFolder_Delete(), BrFolder_Expand(), BrFolder_GetItemAttributes(), BrFolder_IsTreeItemInEnum(), BrFolder_OnContextMenu(), BrFolder_RefreshRecurse(), BrFolder_TreeItemHasThisChild(), BrFolder_Treeview_Rename(), and BrFolder_UpdateItem().

◆ BrFolder_GetName()

static BOOL BrFolder_GetName ( IShellFolder lpsf,
PCIDLIST_RELATIVE  pidlChild,
DWORD  dwFlags,
LPWSTR  lpFriendlyName 
)
static

Definition at line 233 of file brfolder.cpp.

238{
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}
static BOOLEAN bSuccess
Definition: drive.cpp:355
HRESULT GetDisplayNameOf([in] PCUITEMID_CHILD pidl, [in] SHGDNF uFlags, [out] STRRET *lpName)
#define debugstr_w
Definition: kernel32.h:32
const WCHAR * str
BOOL WINAPI StrRetToStrNW(LPWSTR dest, DWORD len, LPSTRRET src, const ITEMIDLIST *pidl)
Definition: shellstring.c:85
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176

Referenced by BrFolder_InsertItem(), and BrFolder_Treeview_Changed().

◆ BrFolder_InitTreeView()

static void BrFolder_InitTreeView ( BrFolder info)
static

Definition at line 169 of file brfolder.cpp.

170{
171 HIMAGELIST hImageList;
172 HRESULT hr;
174
175 Shell_GetImageLists(NULL, &hImageList);
176 if (hImageList)
177 TreeView_SetImageList(info->hwndTreeView, hImageList, 0);
178
179 /* We want to call BrFolder_InsertItem down the code, in order to insert
180 * the root item of the treeview. Due to BrFolder_InsertItem's signature,
181 * we need the following to do this:
182 *
183 * + An ITEMIDLIST corresponding to _the parent_ of root.
184 * + An ITEMIDLIST, which is a relative path from root's parent to root
185 * (containing a single SHITEMID).
186 * + An IShellFolder interface pointer of root's parent folder.
187 *
188 * If root is 'Desktop', then root's parent is also 'Desktop'.
189 */
190
191 PCIDLIST_ABSOLUTE pidlRoot = info->lpBrowseInfo->pidlRoot;
192 CComHeapPtr<ITEMIDLIST_ABSOLUTE> pidlParent(ILClone(pidlRoot));
193 ILRemoveLastID(pidlParent);
194 PCIDLIST_RELATIVE pidlChild = ILFindLastID(pidlRoot);
195
196 CComPtr<IShellFolder> lpsfParent;
197 hr = SHBindToObject(NULL, pidlParent, /*NULL, */ IID_PPV_ARG(IShellFolder, &lpsfParent));
199 return;
200
201 TreeView_DeleteItem(info->hwndTreeView, TVI_ROOT);
202 hItem = BrFolder_InsertItem(info, lpsfParent, pidlChild, pidlParent, TVI_ROOT);
203 TreeView_Expand(info->hwndTreeView, hItem, TVE_EXPAND);
204}
EXTERN_C HRESULT SHBindToObject(_In_opt_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_ REFIID riid, _Out_ void **ppvObj)
Definition: utils.cpp:369
BOOL WINAPI Shell_GetImageLists(HIMAGELIST *lpBigList, HIMAGELIST *lpSmallList)
Definition: iconcache.cpp:683
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:237
LPITEMIDLIST WINAPI ILFindLastID(LPCITEMIDLIST pidl)
Definition: pidl.c:198
BOOL WINAPI ILRemoveLastID(LPITEMIDLIST pidl)
Definition: pidl.c:221
#define TreeView_SetImageList(hwnd, himl, iImage)
Definition: commctrl.h:3452
#define TreeView_DeleteItem(hwnd, hitem)
Definition: commctrl.h:3420

Referenced by BrFolder_OnInitDialog().

◆ BrFolder_InsertItem()

static HTREEITEM BrFolder_InsertItem ( _Inout_ BrFolder info,
_Inout_ IShellFolder lpsf,
_In_ PCUITEMID_CHILD  pidlChild,
_In_ PCIDLIST_ABSOLUTE  pidlParent,
_In_ HTREEITEM  hParent 
)
static

Definition at line 332 of file brfolder.cpp.

338{
339 if (!(BrowseFlagsToSHCONTF(info->lpBrowseInfo->ulFlags) & SHCONTF_NONFOLDERS))
340 {
341#ifdef BIF_BROWSEFILEJUNCTIONS
342 if (!(info->lpBrowseInfo->ulFlags & BIF_BROWSEFILEJUNCTIONS))
343#endif
344 if (SHGetAttributes(lpsf, pidlChild, SFGAO_STREAM) & SFGAO_STREAM)
345 return NULL; // .zip files have both FOLDER and STREAM attributes set
346 }
347
349 if (!BrFolder_GetName(lpsf, pidlChild, SHGDN_NORMAL, szName))
350 return NULL;
351
352 BrItemData *pItemData = new BrItemData();
353
355 item.pszText = szName;
356 item.cchTextMax = _countof(szName);
357 item.lParam = (LPARAM)pItemData;
358
359 PIDLIST_ABSOLUTE pidlFull =
360 (pidlParent ? ILCombine(pidlParent, pidlChild) : ILClone(pidlChild));
361 BrFolder_GetIconPair(pidlFull, &item);
362
363 pItemData->lpsfParent = lpsf;
364 pItemData->pidlFull.Attach(pidlFull);
365 pItemData->pidlChild = ILFindLastID(pItemData->pidlFull);
366
367 if (BrFolder_GetChildrenEnum(info, pItemData, NULL) == S_OK)
368 item.cChildren = 1;
369
370 TVINSERTSTRUCTW tvins = { hParent };
371 tvins.item = item;
372 return TreeView_InsertItem(info->hwndTreeView, &tvins);
373}
static void BrFolder_GetIconPair(PCIDLIST_ABSOLUTE pidl, LPTVITEMW pItem)
Definition: brfolder.cpp:207
static BOOL BrFolder_GetName(IShellFolder *lpsf, PCIDLIST_RELATIVE pidlChild, DWORD dwFlags, LPWSTR lpFriendlyName)
Definition: brfolder.cpp:233
DWORD SHGetAttributes(_In_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_ DWORD dwAttributes)
Definition: utils.cpp:421
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:816
static const WCHAR szName[]
Definition: powrprof.c:45
#define TVIF_TEXT
Definition: commctrl.h:3271
#define TVIF_IMAGE
Definition: commctrl.h:3272
#define TVIF_CHILDREN
Definition: commctrl.h:3277
#define TreeView_InsertItem(hwnd, lpis)
Definition: commctrl.h:3417
#define TVIF_SELECTEDIMAGE
Definition: commctrl.h:3276
#define _countof(array)
Definition: sndvol32.h:70
LONG_PTR LPARAM
Definition: windef.h:208

Referenced by BrFolder_Expand(), BrFolder_InitTreeView(), BrFolder_NewFolder(), and BrFolder_RefreshRecurse().

◆ BrFolder_IsTreeItemInEnum()

static BOOL BrFolder_IsTreeItemInEnum ( _Inout_ BrFolder info,
_In_ HTREEITEM  hItem,
_Inout_ IEnumIDList pEnum 
)
static

Definition at line 251 of file brfolder.cpp.

255{
257 if (!pItemData)
258 return FALSE;
259
260 pEnum->Reset();
261
263 while (pEnum->Next(1, &pidlTemp, NULL) == S_OK)
264 {
265 if (ILIsEqual(pidlTemp, pItemData->pidlChild))
266 return TRUE;
267
268 pidlTemp.Free();
269 }
270
271 return FALSE;
272}

Referenced by BrFolder_RefreshRecurse().

◆ BrFolder_NewFolder()

static HRESULT BrFolder_NewFolder ( BrFolder info)
static

Definition at line 783 of file brfolder.cpp.

784{
785 CComPtr<IShellFolder> desktop, cur;
786 WCHAR wszNewFolder[25], path[MAX_PATH], name[MAX_PATH];
787
788 HRESULT hr = SHGetDesktopFolder(&desktop);
790 return hr;
791
792 if (info->pidlRet)
793 {
794 hr = desktop->BindToObject(info->pidlRet, NULL, IID_PPV_ARG(IShellFolder, &cur));
796 return hr;
797
798 hr = SHGetPathFromIDListW(info->pidlRet, path);
799 }
800 else
801 {
802 cur = desktop;
804 }
805
807 return hr;
808
809 hr = E_FAIL;
810 if (!LoadStringW(shell32_hInstance, IDS_NEWFOLDER, wszNewFolder, _countof(wszNewFolder)))
811 return hr;
812
813 if (!PathYetAnotherMakeUniqueName(name, path, NULL, wszNewFolder))
814 return hr;
815
816 INT len = lstrlenW(path);
817 if (len < MAX_PATH && name[len] == L'\\')
818 len++;
819
821 return hr;
822
823 // Update parent of newly created directory
824 HTREEITEM hParent = TreeView_GetSelection(info->hwndTreeView);
825 if (!hParent)
826 return hr;
827
828 TreeView_Expand(info->hwndTreeView, hParent, TVE_EXPAND);
829
831 item.hItem = hParent;
832 TreeView_GetItem(info->hwndTreeView, &item);
833 BrItemData *item_data = (BrItemData *)item.lParam;
834 if (!item_data)
835 return hr;
836
837 // Update treeview
838 if (!(item.state & TVIS_EXPANDEDONCE))
839 {
840 item.mask = TVIF_STATE;
841 item.state = item.stateMask = TVIS_EXPANDEDONCE;
842 TreeView_SetItem(info->hwndTreeView, &item);
843 }
844
846 hr = cur->ParseDisplayName(NULL, NULL, name + len, NULL, &pidlNew, NULL);
848 return hr;
849
850 HTREEITEM hAdded = BrFolder_InsertItem(info, cur, pidlNew, item_data->pidlFull, hParent);
851 TreeView_SortChildren(info->hwndTreeView, hParent, FALSE);
852 return BrFolder_Rename(info, hAdded);
853}
#define shell32_hInstance
static HRESULT BrFolder_Rename(BrFolder *info, HTREEITEM hItem)
Definition: brfolder.cpp:566
BOOL WINAPI CreateDirectoryW(IN LPCWSTR lpPathName, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes)
Definition: dir.c:90
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
#define IDS_NEWFOLDER
FxCollectionEntry * cur
GLenum GLsizei len
Definition: glext.h:6722
#define L(x)
Definition: ntvdm.h:50
#define TreeView_SortChildren(hwnd, hitem, recurse)
Definition: commctrl.h:3547
#define TVIS_EXPANDEDONCE
Definition: commctrl.h:3290
#define TreeView_GetSelection(hwnd)
Definition: commctrl.h:3478
#define TreeView_SetItem(hwnd, pitem)
Definition: commctrl.h:3502
#define TVIF_STATE
Definition: commctrl.h:3274
#define CSIDL_DESKTOPDIRECTORY
Definition: shlobj.h:2188
@ SHGFP_TYPE_CURRENT
Definition: shlobj.h:2149
Definition: name.c:39
int32_t INT
Definition: typedefs.h:58
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)

Referenced by BrFolder_OnCommand().

◆ BrFolder_OnChange()

static void BrFolder_OnChange ( BrFolder info,
WPARAM  wParam,
LPARAM  lParam 
)
static

Definition at line 1217 of file brfolder.cpp.

1218{
1219 // We use SHCNRF_NewDelivery method
1220 HANDLE hChange = (HANDLE)wParam;
1221 DWORD dwProcID = (DWORD)lParam;
1222
1223 PIDLIST_ABSOLUTE *ppidl = NULL;
1224 LONG event;
1225 HANDLE hLock = SHChangeNotification_Lock(hChange, dwProcID, &ppidl, &event);
1226 if (hLock == NULL)
1227 {
1228 ERR("hLock == NULL\n");
1229 return;
1230 }
1231
1232 BrFolder_OnChangeEx(info, ppidl[0], ppidl[1], (event & ~SHCNE_INTERRUPT));
1233
1235}
static void BrFolder_OnChangeEx(_Inout_ BrFolder *info, _In_ PCIDLIST_ABSOLUTE pidl0, _In_ PCIDLIST_ABSOLUTE pidl1, _In_ LONG event)
Definition: brfolder.cpp:1187
EXTERN_C HANDLE WINAPI SHChangeNotification_Lock(HANDLE hTicket, DWORD dwOwnerPID, LPITEMIDLIST **lppidls, LPLONG lpwEventId)
EXTERN_C BOOL WINAPI SHChangeNotification_Unlock(HANDLE hLock)
WPARAM wParam
Definition: combotst.c:138
struct _cl_event * event
Definition: glext.h:7739
#define DWORD
Definition: nt_native.h:44
long LONG
Definition: pedump.c:60
#define SHCNE_INTERRUPT
Definition: shlobj.h:1915
PVOID HANDLE
Definition: typedefs.h:73

Referenced by BrFolderDlgProc().

◆ BrFolder_OnChangeEx()

static void BrFolder_OnChangeEx ( _Inout_ BrFolder info,
_In_ PCIDLIST_ABSOLUTE  pidl0,
_In_ PCIDLIST_ABSOLUTE  pidl1,
_In_ LONG  event 
)
static

Definition at line 1187 of file brfolder.cpp.

1192{
1193 TRACE("(%p)->(%p, %p, 0x%lX)\n", info, pidl0, pidl1, event);
1194
1195 switch (event)
1196 {
1197 case SHCNE_DRIVEADD:
1198 case SHCNE_MKDIR:
1199 case SHCNE_CREATE:
1200 case SHCNE_DRIVEREMOVED:
1201 case SHCNE_RMDIR:
1202 case SHCNE_DELETE:
1203 case SHCNE_RENAMEFOLDER:
1204 case SHCNE_RENAMEITEM:
1205 case SHCNE_UPDATEDIR:
1206 case SHCNE_UPDATEITEM:
1207 {
1208 // FIXME: Avoid full refresh and optimize for speed. Use pidl0 and pidl1
1210 break;
1211 }
1212 }
1213}
static void BrFolder_Refresh(_Inout_ BrFolder *info)
Definition: brfolder.cpp:1174
#define SHCNE_DRIVEREMOVED
Definition: shlobj.h:1897
#define SHCNE_RMDIR
Definition: shlobj.h:1894
#define SHCNE_DELETE
Definition: shlobj.h:1892
#define SHCNE_MKDIR
Definition: shlobj.h:1893
#define SHCNE_UPDATEITEM
Definition: shlobj.h:1903
#define SHCNE_RENAMEITEM
Definition: shlobj.h:1890
#define SHCNE_UPDATEDIR
Definition: shlobj.h:1902
#define SHCNE_CREATE
Definition: shlobj.h:1891
#define SHCNE_RENAMEFOLDER
Definition: shlobj.h:1907
#define SHCNE_DRIVEADD
Definition: shlobj.h:1898

Referenced by BrFolder_OnChange().

◆ BrFolder_OnCommand()

static void BrFolder_OnCommand ( BrFolder info,
UINT  id 
)
static

Definition at line 888 of file brfolder.cpp.

889{
890 switch (id)
891 {
892 case IDOK:
893 {
895 EndDialog(info->hWnd, IDOK);
896 break;
897 }
898 case IDCANCEL:
899 {
900 EndDialog(info->hWnd, IDCANCEL);
901 break;
902 }
904 {
906 break;
907 }
908 }
909}
static HRESULT BrFolder_NewFolder(BrFolder *info)
Definition: brfolder.cpp:783
static void BrFolder_OnOK(BrFolder *info)
Definition: brfolder.cpp:856
#define IDCANCEL
Definition: winuser.h:834
#define IDOK
Definition: winuser.h:833
BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR)

Referenced by BrFolderDlgProc().

◆ BrFolder_OnContextMenu()

static void BrFolder_OnContextMenu ( BrFolder info,
LPARAM  lParam 
)
static

Definition at line 924 of file brfolder.cpp.

925{
926 enum { IDC_TOGGLE = 1, ID_FIRSTCMD, ID_LASTCMD = 0xffff };
927 HTREEITEM hSelected = TreeView_GetSelection(info.hwndTreeView);
928 CMINVOKECOMMANDINFOEX ici = { sizeof(ici), CMIC_MASK_PTINVOKE, info.hWnd };
929 ici.nShow = SW_SHOW;
930 ici.ptInvoke.x = GET_X_LPARAM(lParam);
931 ici.ptInvoke.y = GET_Y_LPARAM(lParam);
932 if ((int)lParam == -1) // Keyboard
933 {
934 GetTreeViewItemContextMenuPos(info.hwndTreeView, hSelected, &ici.ptInvoke);
935 }
936 else // Get correct item for right-click on not current item
937 {
938 TVHITTESTINFO hti = { ici.ptInvoke };
939 ScreenToClient(info.hwndTreeView, &hti.pt);
940 hSelected = TreeView_HitTest(info.hwndTreeView, &hti);
941 }
943 if (!item)
944 return; // Not on an item
945
946 TV_ITEM tvi;
947 tvi.mask = TVIF_STATE | TVIF_CHILDREN;
948 tvi.stateMask = TVIS_EXPANDED;
949 tvi.hItem = hSelected;
950 TreeView_GetItem(info.hwndTreeView, &tvi);
951
953 HRESULT hr = item->lpsfParent->GetUIObjectOf(info.hWnd, 1, &item->pidlChild,
954 IID_IContextMenu, NULL, (void**)&pcm);
955 if (FAILED(hr))
956 return;
957
958 HMENU hMenu = CreatePopupMenu();
959 if (!hMenu)
960 return;
961 info.pContextMenu = pcm;
962 UINT cmf = ((GetKeyState(VK_SHIFT) < 0) ? CMF_EXTENDEDVERBS : 0) | CMF_CANRENAME;
963 hr = pcm->QueryContextMenu(hMenu, 0, ID_FIRSTCMD, ID_LASTCMD, CMF_EXPLORE | cmf);
964 if (hr > 0)
965 _InsertMenuItemW(hMenu, 0, TRUE, 0, MFT_SEPARATOR, NULL, 0);
966 _InsertMenuItemW(hMenu, 0, TRUE, IDC_TOGGLE, MFT_STRING,
968 MFS_DEFAULT | (tvi.cChildren ? 0 : MFS_GRAYED));
969
970 UINT cmd = TrackPopupMenuEx(hMenu, TPM_RETURNCMD, ici.ptInvoke.x, ici.ptInvoke.y, info.hWnd, NULL);
971 ici.lpVerb = MAKEINTRESOURCEA(cmd - ID_FIRSTCMD);
972 if (cmd == IDC_TOGGLE)
973 {
974 TreeView_SelectItem(info.hwndTreeView, hSelected);
975 TreeView_Expand(info.hwndTreeView, hSelected, TVE_TOGGLE);
976 }
977 else if (cmd != 0 && GetDfmCmd(pcm, ici.lpVerb) == DFM_CMD_RENAME)
978 {
979 BrFolder_Rename(&info, hSelected);
980 }
981 else if (cmd != 0)
982 {
983 if (GetKeyState(VK_SHIFT) < 0)
984 ici.fMask |= CMIC_MASK_SHIFT_DOWN;
985 if (GetKeyState(VK_CONTROL) < 0)
986 ici.fMask |= CMIC_MASK_CONTROL_DOWN;
987 pcm->InvokeCommand((CMINVOKECOMMANDINFO*)&ici);
988 }
989 info.pContextMenu = NULL;
990 DestroyMenu(hMenu);
991}
#define IDS_COLLAPSE
Definition: resource.h:144
#define IDS_EXPAND
Definition: resource.h:143
static void GetTreeViewItemContextMenuPos(HWND hWnd, HTREEITEM hItem, POINT *ppt)
Definition: brfolder.cpp:912
UINT GetDfmCmd(_In_ IContextMenu *pCM, _In_ LPCSTR verba)
Definition: utils.cpp:1732
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:63
#define TreeView_SelectItem(hwnd, hitem)
Definition: commctrl.h:3486
#define TVE_TOGGLE
Definition: commctrl.h:3429
#define TV_ITEM
Definition: commctrl.h:3305
#define TVIS_EXPANDED
Definition: commctrl.h:3289
#define TreeView_HitTest(hwnd, lpht)
Definition: commctrl.h:3518
void WINAPI _InsertMenuItemW(HMENU hmenu, UINT indexMenu, BOOL fByPosition, UINT wID, UINT fType, LPCWSTR dwTypeData, UINT fState)
#define DFM_CMD_RENAME
Definition: shlobj.h:2620
Definition: ftp_var.h:139
#define GET_Y_LPARAM(lp)
Definition: windowsx.h:300
#define GET_X_LPARAM(lp)
Definition: windowsx.h:299
HMENU WINAPI CreatePopupMenu(void)
Definition: menu.c:838
#define VK_CONTROL
Definition: winuser.h:2206
#define MFT_SEPARATOR
Definition: winuser.h:747
BOOL WINAPI TrackPopupMenuEx(_In_ HMENU, _In_ UINT, _In_ int, _In_ int, _In_ HWND, _In_opt_ LPTPMPARAMS)
#define MFS_DEFAULT
Definition: winuser.h:751
#define MFS_GRAYED
Definition: winuser.h:754
#define MAKEINTRESOURCEA(i)
Definition: winuser.h:581
BOOL WINAPI DestroyMenu(_In_ HMENU)
#define VK_SHIFT
Definition: winuser.h:2205
#define MFT_STRING
Definition: winuser.h:749
#define SW_SHOW
Definition: winuser.h:778
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
#define TPM_RETURNCMD
Definition: winuser.h:2390
SHORT WINAPI GetKeyState(_In_ int)
BOOL WINAPI ScreenToClient(_In_ HWND, _Inout_ LPPOINT)

Referenced by BrFolderDlgProc().

◆ BrFolder_OnDestroy()

static void BrFolder_OnDestroy ( BrFolder info)
static

Definition at line 1116 of file brfolder.cpp.

1117{
1118 if (info->layout)
1119 {
1120 LayoutDestroy(info->layout);
1121 info->layout = NULL;
1122 }
1123
1124 SHChangeNotifyDeregister(info->hChangeNotify);
1125}
EXTERN_C BOOL WINAPI SHChangeNotifyDeregister(ULONG hNotify)
static __inline void LayoutDestroy(LAYOUT_DATA *pData)
Definition: layout.h:252

Referenced by BrFolderDlgProc().

◆ BrFolder_OnInitDialog()

static BOOL BrFolder_OnInitDialog ( HWND  hWnd,
BrFolder info 
)
static

Definition at line 679 of file brfolder.cpp.

680{
683 LPBROWSEINFOW lpBrowseInfo = info->lpBrowseInfo;
684
685 info->hWnd = hWnd;
687
688 if (lpBrowseInfo->ulFlags & BIF_NEWDIALOGSTYLE)
689 FIXME("flags BIF_NEWDIALOGSTYLE partially implemented\n");
690
691 if (lpBrowseInfo->ulFlags & ~SUPPORTED_FLAGS)
692 FIXME("flags %x not implemented\n", (lpBrowseInfo->ulFlags & ~SUPPORTED_FLAGS));
693
694 info->layout = NULL;
695 if (lpBrowseInfo->ulFlags & BIF_USENEWUI)
696 {
697 RECT rcWnd;
698
699 // Resize the treeview if there's not editbox
700 if ((lpBrowseInfo->ulFlags & BIF_NEWDIALOGSTYLE) &&
701 !(lpBrowseInfo->ulFlags & BIF_EDITBOX))
702 {
703 RECT rcEdit, rcTreeView;
706 LONG cy = rcTreeView.top - rcEdit.top;
707 MapWindowPoints(NULL, hWnd, (LPPOINT)&rcTreeView, sizeof(RECT) / sizeof(POINT));
708 rcTreeView.top -= cy;
710 rcTreeView.left, rcTreeView.top,
711 rcTreeView.right - rcTreeView.left,
712 rcTreeView.bottom - rcTreeView.top, TRUE);
713 }
714
715 if (lpBrowseInfo->ulFlags & BIF_NEWDIALOGSTYLE)
717
718 // TODO: Windows allows shrinking the windows a bit
719 GetWindowRect(hWnd, &rcWnd);
720 info->szMin.cx = rcWnd.right - rcWnd.left;
721 info->szMin.cy = rcWnd.bottom - rcWnd.top;
722 }
723
724 if (lpBrowseInfo->lpszTitle)
726 else
728
729 if (!(lpBrowseInfo->ulFlags & BIF_STATUSTEXT) || (lpBrowseInfo->ulFlags & BIF_USENEWUI))
731
732 // Hide "Make New Folder" Button?
733 if ((lpBrowseInfo->ulFlags & BIF_NONEWFOLDERBUTTON) ||
734 !(lpBrowseInfo->ulFlags & BIF_NEWDIALOGSTYLE))
735 {
737 }
738
739 // Hide the editbox?
740 if (!(lpBrowseInfo->ulFlags & BIF_EDITBOX))
741 {
744 }
745
747 if (info->hwndTreeView)
749 else
750 ERR("treeview control missing!\n");
751
752 // Register for change notifications
753 SHGetFolderLocation(NULL, CSIDL_DESKTOP, NULL, 0, &pidlDesktop);
754
755 ntreg.pidl = pidlDesktop;
756 ntreg.fRecursive = TRUE;
757 info->hChangeNotify = SHChangeNotifyRegister(hWnd,
760 SHV_CHANGE_NOTIFY, 1, &ntreg);
761
762 if (!lpBrowseInfo->pidlRoot)
763 {
764 UINT csidl = (lpBrowseInfo->ulFlags & BIF_NEWDIALOGSTYLE) ? CSIDL_PERSONAL : CSIDL_DRIVES;
766 if (pidl)
767 {
769 if (csidl == CSIDL_DRIVES)
771 ILFree(pidl);
772 }
773 }
774
775 BrFolder_Callback(info->lpBrowseInfo, hWnd, BFFM_INITIALIZED, 0);
776
779 return TRUE;
780}
#define FIXME(fmt,...)
Definition: precomp.h:53
static void BrFolder_Callback(LPBROWSEINFOW lpBrowseInfo, HWND hWnd, UINT uMsg, LPARAM lParam)
Definition: brfolder.cpp:93
static const LAYOUT_INFO g_layout_info[]
Definition: brfolder.cpp:63
#define SHV_CHANGE_NOTIFY
Definition: brfolder.cpp:18
#define SUPPORTED_FLAGS
Definition: brfolder.cpp:74
static void BrFolder_InitTreeView(BrFolder *info)
Definition: brfolder.cpp:169
EXTERN_C ULONG WINAPI SHChangeNotifyRegister(HWND hwnd, INT fSources, LONG wEventMask, UINT uMsg, INT cItems, SHChangeNotifyEntry *lpItems)
HRESULT WINAPI SHGetFolderLocation(HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwReserved, LPITEMIDLIST *ppidl)
Definition: shellpath.c:3150
static __inline LAYOUT_DATA * LayoutInit(HWND hwndParent, const LAYOUT_INFO *pLayouts, INT cLayouts)
Definition: layout.h:207
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
LPITEMIDLIST WINAPI SHCloneSpecialIDList(HWND hwndOwner, int nFolder, BOOL fCreate)
Definition: pidl.c:445
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:586
#define CSIDL_PERSONAL
Definition: shlobj.h:2178
#define BFFM_SETEXPANDED
Definition: shlobj.h:1249
#define BFFM_SETSELECTION
Definition: shlobj.h:1256
#define BIF_USENEWUI
Definition: shlobj.h:1224
#define SHCNRF_NewDelivery
Definition: shlobj.h:1938
#define SHCNRF_ShellLevel
Definition: shlobj.h:1936
#define CSIDL_DESKTOP
Definition: shlobj.h:2173
#define BFFM_INITIALIZED
Definition: shlobj.h:1236
#define SHCNE_ALLEVENTS
Definition: shlobj.h:1914
#define CSIDL_DRIVES
Definition: shlobj.h:2189
#define BIF_EDITBOX
Definition: shlobj.h:1221
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 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_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
PCIDLIST_ABSOLUTE pidl
Definition: shlobj.h:1886
PCIDLIST_ABSOLUTE pidlRoot
Definition: shlobj.h:1201
LPCWSTR lpszTitle
Definition: shlobj.h:1203
LONG right
Definition: windef.h:308
LONG bottom
Definition: windef.h:309
LONG top
Definition: windef.h:307
LONG left
Definition: windef.h:306
#define SW_HIDE
Definition: winuser.h:771
#define DWLP_USER
Definition: winuser.h:875
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
BOOL WINAPI GetWindowRect(_In_ HWND, _Out_ LPRECT)
BOOL WINAPI SetDlgItemTextW(_In_ HWND, _In_ int, _In_ LPCWSTR)
int WINAPI MapWindowPoints(_In_opt_ HWND hWndFrom, _In_opt_ HWND hWndTo, _Inout_updates_(cPoints) LPPOINT lpPoints, _In_ UINT cPoints)
#define SetWindowLongPtrW
Definition: winuser.h:5358
BOOL WINAPI MoveWindow(_In_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ BOOL)

Referenced by BrFolderDlgProc().

◆ BrFolder_OnNotify()

static LRESULT BrFolder_OnNotify ( BrFolder info,
UINT  CtlID,
LPNMHDR  lpnmh 
)
static

Definition at line 633 of file brfolder.cpp.

634{
635 NMTREEVIEWW *pnmtv = (NMTREEVIEWW *)lpnmh;
636
637 TRACE("%p %x %p msg=%x\n", info, CtlID, lpnmh, pnmtv->hdr.code);
638
640 return 0;
641
642 switch (pnmtv->hdr.code)
643 {
644 case TVN_DELETEITEMA:
645 case TVN_DELETEITEMW:
646 return BrFolder_Treeview_Delete(info, pnmtv);
647
650 return BrFolder_Treeview_Expand(info, pnmtv);
651
652 case TVN_SELCHANGEDA:
653 case TVN_SELCHANGEDW:
654 return BrFolder_Treeview_Changed(info, pnmtv);
655
658 {
659 NMTVDISPINFO &tvdi = *(NMTVDISPINFO*)lpnmh;
660 UINT att = BrFolder_GetItemAttributes(info, tvdi.item.hItem, SFGAO_CANRENAME);
661 return !(att & SFGAO_CANRENAME);
662 }
663
666
667 case TVN_KEYDOWN:
669
670 default:
671 WARN("unhandled (%d)\n", pnmtv->hdr.code);
672 break;
673 }
674
675 return 0;
676}
#define WARN(fmt,...)
Definition: precomp.h:61
static LRESULT BrFolder_Treeview_Expand(BrFolder *info, NMTREEVIEWW *pnmtv)
Definition: brfolder.cpp:478
static SFGAOF BrFolder_GetItemAttributes(BrFolder *info, HTREEITEM hItem, SFGAOF Att)
Definition: brfolder.cpp:114
static HRESULT BrFolder_Treeview_Changed(BrFolder *info, NMTREEVIEWW *pnmtv)
Definition: brfolder.cpp:512
static LRESULT BrFolder_Treeview_Keydown(BrFolder *info, LPNMTVKEYDOWN keydown)
Definition: brfolder.cpp:601
static LRESULT BrFolder_Treeview_Rename(BrFolder *info, NMTVDISPINFOW *pnmtv)
Definition: brfolder.cpp:529
static LRESULT BrFolder_Treeview_Delete(BrFolder *info, NMTREEVIEWW *pnmtv)
Definition: brfolder.cpp:467
#define TVN_KEYDOWN
Definition: commctrl.h:3718
#define TVN_ITEMEXPANDINGA
Definition: commctrl.h:3704
#define NMTVDISPINFO
Definition: commctrl.h:3680
#define TVN_BEGINLABELEDITA
Definition: commctrl.h:3714
#define TVN_SELCHANGEDW
Definition: commctrl.h:3653
#define TVN_DELETEITEMA
Definition: commctrl.h:3712
#define TVN_ITEMEXPANDINGW
Definition: commctrl.h:3705
#define TVN_BEGINLABELEDITW
Definition: commctrl.h:3715
#define TVN_SELCHANGEDA
Definition: commctrl.h:3652
#define TVN_ENDLABELEDITW
Definition: commctrl.h:3717
#define TVN_DELETEITEMW
Definition: commctrl.h:3713
UINT_PTR idFrom
Definition: winuser.h:3161
UINT code
Definition: winuser.h:3162

Referenced by BrFolderDlgProc().

◆ BrFolder_OnOK()

static void BrFolder_OnOK ( BrFolder info)
static

Definition at line 856 of file brfolder.cpp.

857{
858 // Get the text
861 StrTrimW(szPath, L" \t");
862
863 // The original pidl is owned by the treeview and will be free'd.
865 info->pidlRet = ILCreateFromPathW(szPath); // It's valid path
866 else
867 info->pidlRet = ILClone(info->pidlRet);
868
869 if (!info->pidlRet) // A null pidl would mean a cancel
870 info->pidlRet = _ILCreateDesktop();
871
872 pdump(info->pidlRet);
873
874 LPBROWSEINFOW lpBrowseInfo = info->lpBrowseInfo;
875 if (!lpBrowseInfo->pszDisplayName)
876 return;
877
878 SHFILEINFOW fileInfo = { NULL };
879 lpBrowseInfo->pszDisplayName[0] = UNICODE_NULL;
880 if (SHGetFileInfoW((LPCWSTR)info->pidlRet, 0, &fileInfo, sizeof(fileInfo),
882 {
883 lstrcpynW(lpBrowseInfo->pszDisplayName, fileInfo.szDisplayName, MAX_PATH);
884 }
885}
void pdump(LPCITEMIDLIST pidl)
Definition: debughlp.cpp:322
#define lstrcpynW
Definition: compat.h:738
BOOL WINAPI PathIsDirectoryW(LPCWSTR lpszPath)
Definition: path.c:1729
BOOL WINAPI PathIsRelativeW(LPCWSTR lpszPath)
Definition: path.c:1585
BOOL WINAPI StrTrimW(LPWSTR lpszStr, LPCWSTR lpszTrim)
Definition: string.c:1883
LPCWSTR szPath
Definition: env.c:37
LPITEMIDLIST _ILCreateDesktop(void)
Definition: pidl.c:1747
LPITEMIDLIST WINAPI ILCreateFromPathW(LPCWSTR path)
Definition: pidl.c:1101
DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path, DWORD dwFileAttributes, SHFILEINFOW *psfi, UINT sizeofpsfi, UINT flags)
Definition: shell32_main.c:430
#define SHGFI_DISPLAYNAME
Definition: shellapi.h:167
WCHAR szDisplayName[MAX_PATH]
Definition: shellapi.h:376
LPWSTR pszDisplayName
Definition: shlobj.h:1202
UINT WINAPI GetDlgItemTextW(HWND hDlg, int nIDDlgItem, LPWSTR lpString, int nMaxCount)
Definition: dialog.c:2263
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185

Referenced by BrFolder_OnCommand().

◆ BrFolder_OnSetExpanded()

static BOOL BrFolder_OnSetExpanded ( BrFolder info,
LPITEMIDLIST  pidlSelection,
LPWSTR  pszString 
)
static

Definition at line 1061 of file brfolder.cpp.

1062{
1064 BOOL ret;
1065 if (pszString)
1067 else
1068 ret = BrFolder_ExpandToPidl(info, pidlSelection, &hItem);
1069
1070 if (ret)
1071 TreeView_Expand(info->hwndTreeView, hItem, TVE_EXPAND);
1072 return ret;
1073}
static BOOL BrFolder_ExpandToString(BrFolder *info, LPWSTR pszString, HTREEITEM *phItem)
Definition: brfolder.cpp:1053
int ret

Referenced by BrFolderDlgProc().

◆ BrFolder_OnSetSelectionA()

static BOOL BrFolder_OnSetSelectionA ( BrFolder info,
LPSTR  pszSelectionA 
)
static

Definition at line 1102 of file brfolder.cpp.

1103{
1104 if (!pszSelectionA)
1105 return FALSE;
1106
1107 CComHeapPtr<WCHAR> pszSelectionW;
1108 __SHCloneStrAtoW(&pszSelectionW, pszSelectionA);
1109 if (!pszSelectionW)
1110 return FALSE;
1111
1112 return BrFolder_OnSetSelectionW(info, pszSelectionW);
1113}
static BOOL BrFolder_OnSetSelectionW(BrFolder *info, LPWSTR pszSelection)
Definition: brfolder.cpp:1089
static __inline LPWSTR __SHCloneStrAtoW(WCHAR **target, const char *source)
Definition: shell32_main.h:175

Referenced by BrFolderDlgProc().

◆ BrFolder_OnSetSelectionPidl()

static BOOL BrFolder_OnSetSelectionPidl ( BrFolder info,
LPITEMIDLIST  pidlSelection 
)
static

Definition at line 1076 of file brfolder.cpp.

1077{
1078 if (!pidlSelection)
1079 return FALSE;
1080
1082 BOOL ret = BrFolder_ExpandToPidl(info, pidlSelection, &hItem);
1083 if (ret)
1084 TreeView_SelectItem(info->hwndTreeView, hItem);
1085 return ret;
1086}

Referenced by BrFolderDlgProc().

◆ BrFolder_OnSetSelectionW()

static BOOL BrFolder_OnSetSelectionW ( BrFolder info,
LPWSTR  pszSelection 
)
static

Definition at line 1089 of file brfolder.cpp.

1090{
1091 if (!pszSelection)
1092 return FALSE;
1093
1095 BOOL ret = BrFolder_ExpandToString(info, pszSelection, &hItem);
1096 if (ret)
1097 TreeView_SelectItem(info->hwndTreeView, hItem);
1098 return ret;
1099}

Referenced by BrFolder_OnSetSelectionA(), and BrFolderDlgProc().

◆ BrFolder_Refresh()

static void BrFolder_Refresh ( _Inout_ BrFolder info)
static

Definition at line 1174 of file brfolder.cpp.

1175{
1176 HTREEITEM hRoot = TreeView_GetRoot(info->hwndTreeView);
1177
1178 SendMessageW(info->hwndTreeView, WM_SETREDRAW, FALSE, 0);
1179
1181
1182 SendMessageW(info->hwndTreeView, WM_SETREDRAW, TRUE, 0);
1183 InvalidateRect(info->hwndTreeView, NULL, TRUE);
1184}
static void BrFolder_RefreshRecurse(_Inout_ BrFolder *info, _In_ HTREEITEM hTarget)
Definition: brfolder.cpp:1128
static HTREEITEM hRoot
Definition: treeview.c:383
BOOL WINAPI InvalidateRect(_In_opt_ HWND, _In_opt_ LPCRECT, _In_ BOOL)
#define WM_SETREDRAW
Definition: winuser.h:1619

Referenced by BrFolder_OnChangeEx(), and BrFolder_Treeview_Keydown().

◆ BrFolder_RefreshRecurse()

static void BrFolder_RefreshRecurse ( _Inout_ BrFolder info,
_In_ HTREEITEM  hTarget 
)
static

Definition at line 1128 of file brfolder.cpp.

1131{
1132 // Get enum
1134 BrItemData *pItemData = BrFolder_GetItemData(info, hTarget);
1135 HRESULT hrEnum = BrFolder_GetChildrenEnum(info, pItemData, &pEnum);
1136
1137 // Insert new items
1138 if (SUCCEEDED(hrEnum))
1139 {
1141 while (S_OK == pEnum->Next(1, &pidlTemp, NULL))
1142 {
1143 if (!BrFolder_TreeItemHasThisChild(info, hTarget, pidlTemp))
1144 {
1145 BrFolder_InsertItem(info, pItemData->lpsfParent, pidlTemp, pItemData->pidlFull,
1146 hTarget);
1147 }
1148 pidlTemp.Free();
1149 }
1150 }
1151
1152 // Delete zombie items and update items
1153 HTREEITEM hItem, hNextItem;
1154 for (hItem = TreeView_GetChild(info->hwndTreeView, hTarget); hItem; hItem = hNextItem)
1155 {
1156 hNextItem = TreeView_GetNextSibling(info->hwndTreeView, hItem);
1157
1158 if (FAILED(hrEnum) || !BrFolder_IsTreeItemInEnum(info, hItem, pEnum))
1159 {
1160 TreeView_DeleteItem(info->hwndTreeView, hItem);
1161 hNextItem = TreeView_GetChild(info->hwndTreeView, hTarget);
1162 continue;
1163 }
1164
1167 }
1168
1169 if (SUCCEEDED(hrEnum))
1170 TreeView_SortChildren(info->hwndTreeView, hTarget, FALSE);
1171}
static BOOL BrFolder_IsTreeItemInEnum(_Inout_ BrFolder *info, _In_ HTREEITEM hItem, _Inout_ IEnumIDList *pEnum)
Definition: brfolder.cpp:251
static void BrFolder_UpdateItem(_In_ BrFolder *info, _In_ HTREEITEM hItem)
Definition: brfolder.cpp:292
static BOOL BrFolder_TreeItemHasThisChild(_In_ BrFolder *info, _In_ HTREEITEM hItem, _Outptr_opt_ PITEMID_CHILD pidlChild)
Definition: brfolder.cpp:275

Referenced by BrFolder_Refresh(), and BrFolder_RefreshRecurse().

◆ BrFolder_Rename()

static HRESULT BrFolder_Rename ( BrFolder info,
HTREEITEM  hItem 
)
static

Definition at line 566 of file brfolder.cpp.

567{
568 TreeView_SelectItem(info->hwndTreeView, hItem);
569 TreeView_EditLabel(info->hwndTreeView, hItem);
570 return S_OK;
571}
#define TreeView_EditLabel(hwnd, hitem)
Definition: commctrl.h:3509

Referenced by BrFolder_NewFolder(), BrFolder_OnContextMenu(), and BrFolder_Treeview_Keydown().

◆ BrFolder_TreeItemHasThisChild()

static BOOL BrFolder_TreeItemHasThisChild ( _In_ BrFolder info,
_In_ HTREEITEM  hItem,
_Outptr_opt_ PITEMID_CHILD  pidlChild 
)
static

Definition at line 275 of file brfolder.cpp.

279{
280 for (hItem = TreeView_GetChild(info->hwndTreeView, hItem); hItem;
281 hItem = TreeView_GetNextSibling(info->hwndTreeView, hItem))
282 {
284 if (ILIsEqual(pItemData->pidlChild, pidlChild))
285 return TRUE;
286 }
287
288 return FALSE;
289}

Referenced by BrFolder_RefreshRecurse().

◆ BrFolder_Treeview_Changed()

static HRESULT BrFolder_Treeview_Changed ( BrFolder info,
NMTREEVIEWW pnmtv 
)
static

Definition at line 512 of file brfolder.cpp.

513{
514 BrItemData *pItemData = (BrItemData *)pnmtv->itemNew.lParam;
515
516 ILFree(info->pidlRet);
517 info->pidlRet = ILClone(pItemData->pidlFull);
518
520 if (BrFolder_GetName(pItemData->lpsfParent, pItemData->pidlChild, SHGDN_NORMAL, szName))
522
523 BrFolder_Callback(info->lpBrowseInfo, info->hWnd, BFFM_SELCHANGED, (LPARAM)info->pidlRet);
525 return S_OK;
526}
static void BrFolder_CheckValidSelection(BrFolder *info, BrItemData *pItemData)
Definition: brfolder.cpp:430
#define BFFM_SELCHANGED
Definition: shlobj.h:1237
TVITEMW itemNew
Definition: commctrl.h:3643
LPARAM lParam
Definition: commctrl.h:3330

Referenced by BrFolder_OnNotify(), and BrFolder_Treeview_Rename().

◆ BrFolder_Treeview_Delete()

static LRESULT BrFolder_Treeview_Delete ( BrFolder info,
NMTREEVIEWW pnmtv 
)
static

Definition at line 467 of file brfolder.cpp.

468{
469 BrItemData *pItemData = (BrItemData *)pnmtv->itemOld.lParam;
470
471 TRACE("TVN_DELETEITEMA/W %p\n", pItemData);
472
473 delete pItemData;
474 return 0;
475}
TVITEMW itemOld
Definition: commctrl.h:3642

Referenced by BrFolder_OnNotify().

◆ BrFolder_Treeview_Expand()

static LRESULT BrFolder_Treeview_Expand ( BrFolder info,
NMTREEVIEWW pnmtv 
)
static

Definition at line 478 of file brfolder.cpp.

479{
480 BrItemData *pItemData = (BrItemData *)pnmtv->itemNew.lParam;
481
482 TRACE("TVN_ITEMEXPANDINGA/W\n");
483
484 if ((pnmtv->itemNew.state & TVIS_EXPANDEDONCE))
485 return 0;
486
487 HRESULT hr = S_OK;
489 if (!_ILIsEmpty(pItemData->pidlChild))
490 {
491 hr = pItemData->lpsfParent->BindToObject(pItemData->pidlChild, NULL,
492 IID_PPV_ARG(IShellFolder, &lpsf2));
493 }
494 else
495 {
496 lpsf2 = pItemData->lpsfParent;
497 }
498
499 HTREEITEM hItem = pnmtv->itemNew.hItem;
501 BrFolder_Expand(info, lpsf2, pItemData->pidlFull, hItem);
502
503 // My Computer is already sorted and trying to do a simple text
504 // sort will only mess things up
505 if (!_ILIsMyComputer(pItemData->pidlChild))
506 TreeView_SortChildren(info->hwndTreeView, hItem, FALSE);
507
508 return 0;
509}
static void BrFolder_Expand(_In_ BrFolder *info, _In_ IShellFolder *lpsf, _In_ PCIDLIST_ABSOLUTE pidlFull, _In_ HTREEITEM hParent)
Definition: brfolder.cpp:389
BOOL _ILIsMyComputer(LPCITEMIDLIST pidl)
Definition: pidl.c:2080
HTREEITEM hItem
Definition: commctrl.h:3322
UINT state
Definition: commctrl.h:3323

Referenced by BrFolder_OnNotify().

◆ BrFolder_Treeview_Keydown()

static LRESULT BrFolder_Treeview_Keydown ( BrFolder info,
LPNMTVKEYDOWN  keydown 
)
static

Definition at line 601 of file brfolder.cpp.

602{
603 // Old dialog doesn't support those advanced features
604 if (!(info->lpBrowseInfo->ulFlags & BIF_USENEWUI))
605 return 0;
606
607 HTREEITEM hItem = TreeView_GetSelection(info->hwndTreeView);
608
609 switch (keydown->wVKey)
610 {
611 case VK_F2:
613 break;
614 case VK_DELETE:
616 break;
617 case 'R':
618 {
619 if (GetKeyState(VK_CONTROL) < 0) // Ctrl+R
621 break;
622 }
623 case VK_F5:
624 {
626 break;
627 }
628 }
629 return 0;
630}
static void BrFolder_Delete(BrFolder *info, HTREEITEM hItem)
Definition: brfolder.cpp:574
#define VK_F5
Definition: winuser.h:2262
#define VK_DELETE
Definition: winuser.h:2236
#define VK_F2
Definition: winuser.h:2259

Referenced by BrFolder_OnNotify().

◆ BrFolder_Treeview_Rename()

static LRESULT BrFolder_Treeview_Rename ( BrFolder info,
NMTVDISPINFOW pnmtv 
)
static

Definition at line 529 of file brfolder.cpp.

530{
531 if (!pnmtv->item.pszText)
532 return FALSE;
533
534 HTREEITEM hItem = TreeView_GetSelection(info->hwndTreeView);
536 ASSERT(data);
537 ASSERT(BrFolder_GetItemAttributes(info, hItem, SFGAO_CANRENAME) & SFGAO_CANRENAME);
538
539 PITEMID_CHILD newChild;
540 HRESULT hr = data->lpsfParent->SetNameOf(info->hWnd, data->pidlChild,
541 pnmtv->item.pszText, SHGDN_NORMAL, &newChild);
542 if (FAILED(hr))
543 return FALSE;
544
545 LPITEMIDLIST newFull;
546 if (SUCCEEDED(hr = SHILClone(data->pidlFull, &newFull)))
547 {
548 ILRemoveLastID(newFull);
549 if (SUCCEEDED(hr = SHILAppend(newChild, &newFull)))
550 {
551 data->pidlFull.Free();
552 data->pidlFull.Attach(newFull);
553 data->pidlChild = ILFindLastID(data->pidlFull);
554 }
555 newChild = NULL; // SHILAppend is nuts and frees this
556 }
557 ILFree(newChild);
558
559 NMTREEVIEWW nmtv;
560 nmtv.itemNew.lParam = (LPARAM)data;
562 return TRUE;
563}
HRESULT SHILAppend(_Inout_ LPITEMIDLIST pidl, _Inout_ LPITEMIDLIST *ppidl)
Definition: utils.cpp:192
HRESULT SHILClone(_In_opt_ LPCITEMIDLIST pidl, _Outptr_ LPITEMIDLIST *ppidl)
Definition: utils.cpp:132
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
#define ASSERT(a)
Definition: mode.c:44
TVITEMW item
Definition: commctrl.h:3677
LPWSTR pszText
Definition: commctrl.h:3325

Referenced by BrFolder_OnNotify().

◆ BrFolder_UpdateItem()

static void BrFolder_UpdateItem ( _In_ BrFolder info,
_In_ HTREEITEM  hItem 
)
static

Definition at line 292 of file brfolder.cpp.

295{
297 if (!pItemData)
298 return;
299
301 item.hItem = hItem;
302
303 BrFolder_GetIconPair(pItemData->pidlFull, &item);
304
305 item.cChildren = 0;
307 if (BrFolder_GetChildrenEnum(info, pItemData, &pEnum) == S_OK)
308 {
310 if (pEnum->Next(1, &pidlTemp, NULL) == S_OK)
311 ++item.cChildren;
312 }
313
314 TreeView_SetItem(info->hwndTreeView, &item);
315}

Referenced by BrFolder_RefreshRecurse().

◆ BrFolderDlgProc()

static INT_PTR CALLBACK BrFolderDlgProc ( HWND  hWnd,
UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam 
)
static

Definition at line 1241 of file brfolder.cpp.

1242{
1243 if (uMsg == WM_INITDIALOG)
1245
1247 if (!info)
1248 return 0;
1249
1250 if (info->pContextMenu)
1251 {
1253 if (SHForwardContextMenuMsg(info->pContextMenu, uMsg, wParam,
1254 lParam, &result, TRUE) == S_OK)
1255 {
1257 return TRUE;
1258 }
1259 }
1260
1261 switch (uMsg)
1262 {
1263 case WM_NOTIFY:
1265 return TRUE;
1266
1267 case WM_COMMAND:
1269 break;
1270
1271 case WM_CONTEXTMENU:
1272 if (info->hwndTreeView == (HWND)wParam)
1274 break;
1275
1276 case WM_GETMINMAXINFO:
1277 ((LPMINMAXINFO)lParam)->ptMinTrackSize.x = info->szMin.cx;
1278 ((LPMINMAXINFO)lParam)->ptMinTrackSize.y = info->szMin.cy;
1279 break;
1280
1281 case WM_SIZE:
1282 if (info->layout) // New style dialogs
1284 break;
1285
1288 break;
1289
1292 break;
1293
1294 case BFFM_ENABLEOK:
1296 break;
1297
1298 case BFFM_SETOKTEXT: // Unicode only
1300 break;
1301
1302 case BFFM_SETSELECTIONA:
1303 if (wParam) // String
1305 else // PIDL
1307
1308 case BFFM_SETSELECTIONW:
1309 if (wParam) // String
1311 else // PIDL
1313
1314 case BFFM_SETEXPANDED: // Unicode only
1315 if (wParam) // String
1317 else // PIDL
1319
1320 case SHV_CHANGE_NOTIFY:
1322 break;
1323
1324 case WM_DESTROY:
1326 break;
1327 }
1328
1329 return 0;
1330}
static void BrFolder_OnContextMenu(BrFolder &info, LPARAM lParam)
Definition: brfolder.cpp:924
static void BrFolder_OnChange(BrFolder *info, WPARAM wParam, LPARAM lParam)
Definition: brfolder.cpp:1217
static BOOL BrFolder_OnSetSelectionPidl(BrFolder *info, LPITEMIDLIST pidlSelection)
Definition: brfolder.cpp:1076
static BOOL BrFolder_OnSetExpanded(BrFolder *info, LPITEMIDLIST pidlSelection, LPWSTR pszString)
Definition: brfolder.cpp:1061
static LRESULT BrFolder_OnNotify(BrFolder *info, UINT CtlID, LPNMHDR lpnmh)
Definition: brfolder.cpp:633
static BOOL BrFolder_OnSetSelectionA(BrFolder *info, LPSTR pszSelectionA)
Definition: brfolder.cpp:1102
static BOOL BrFolder_OnInitDialog(HWND hWnd, BrFolder *info)
Definition: brfolder.cpp:679
static void BrFolder_OnCommand(BrFolder *info, UINT id)
Definition: brfolder.cpp:888
static void BrFolder_OnDestroy(BrFolder *info)
Definition: brfolder.cpp:1116
GLuint64EXT * result
Definition: glext.h:11304
static __inline void LayoutUpdate(HWND ignored1, LAYOUT_DATA *pData, LPCVOID ignored2, UINT ignored3)
Definition: layout.h:188
#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
#define BFFM_SETOKTEXT
Definition: shlobj.h:1248
#define BFFM_SETSELECTIONW
Definition: shlobj.h:1246
#define BFFM_SETSTATUSTEXTW
Definition: shlobj.h:1247
#define BFFM_SETSTATUSTEXTA
Definition: shlobj.h:1243
#define BFFM_SETSELECTIONA
Definition: shlobj.h:1245
#define SetWindowLongPtr
Definition: treelist.c:70
LONG_PTR LRESULT
Definition: windef.h:209
#define GetWindowLongPtrW
Definition: winuser.h:4832
#define WM_SIZE
Definition: winuser.h:1614
#define WM_COMMAND
Definition: winuser.h:1743
#define WM_INITDIALOG
Definition: winuser.h:1742
#define WM_GETMINMAXINFO
Definition: winuser.h:1643
BOOL WINAPI SetDlgItemTextA(_In_ HWND, _In_ int, _In_ LPCSTR)
#define DWLP_MSGRESULT
Definition: winuser.h:873
struct tagMINMAXINFO * LPMINMAXINFO
#define WM_DESTROY
Definition: winuser.h:1612
char * LPSTR
Definition: xmlstorage.h:182

Referenced by SHBrowseForFolderW().

◆ BrowseFlagsToSHCONTF()

static DWORD BrowseFlagsToSHCONTF ( UINT  ulFlags)
inlinestatic

Definition at line 87 of file brfolder.cpp.

88{
89 return SHCONTF_FOLDERS | ((ulFlags & BIF_BROWSEINCLUDEFILES) ? SHCONTF_NONFOLDERS : 0);
90}

Referenced by BrFolder_GetChildrenEnum(), and BrFolder_InsertItem().

◆ GetIconIndex()

static INT GetIconIndex ( PCIDLIST_ABSOLUTE  pidl,
UINT  uFlags 
)
static

Definition at line 37 of file brfolder.cpp.

38{
39 SHFILEINFOW sfi;
40 SHGetFileInfoW((LPCWSTR)pidl, 0, &sfi, sizeof(sfi), uFlags);
41 return sfi.iIcon;
42}
UINT uFlags
Definition: api.c:59

Referenced by BrFolder_GetIconPair().

◆ GetTreeViewItemContextMenuPos()

static void GetTreeViewItemContextMenuPos ( HWND  hWnd,
HTREEITEM  hItem,
POINT ppt 
)
static

Definition at line 912 of file brfolder.cpp.

913{
914 RECT rc;
916 {
917 ppt->x = (rc.left + rc.right) / 2;
918 ppt->y = (rc.top + rc.bottom) / 2;
919 }
920 ClientToScreen(hWnd, ppt);
921}
#define TreeView_GetItemRect(hwnd, hitem, prc, code)
Definition: commctrl.h:3434
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48
BOOL WINAPI ClientToScreen(_In_ HWND, _Inout_ LPPOINT)

Referenced by BrFolder_OnContextMenu().

◆ ILCloneToDepth()

static LPITEMIDLIST ILCloneToDepth ( LPCITEMIDLIST  pidlSrc,
UINT  depth 
)
static

Definition at line 21 of file brfolder.cpp.

22{
23 SIZE_T cb = 0;
24 for (LPCITEMIDLIST pidl = pidlSrc; pidl && depth--; pidl = ILGetNext(pidl))
25 cb += pidl->mkid.cb;
26
27 LPITEMIDLIST pidlOut = (LPITEMIDLIST)SHAlloc(cb + sizeof(WORD));
28 if (pidlOut)
29 {
30 CopyMemory(pidlOut, pidlSrc, cb);
31 ZeroMemory(((BYTE*)pidlOut) + cb, sizeof(WORD));
32 }
33 return pidlOut;
34}
LPVOID WINAPI SHAlloc(SIZE_T len)
Definition: shellole.c:304
unsigned short WORD
Definition: ntddk_ex.h:93
static HMODULE MODULEINFO DWORD cb
Definition: module.c:33
LPITEMIDLIST WINAPI ILGetNext(LPCITEMIDLIST pidl)
Definition: pidl.c:970
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define ZeroMemory
Definition: winbase.h:1737
#define CopyMemory
Definition: winbase.h:1735
unsigned char BYTE
Definition: xxhash.c:193

Referenced by BrFolder_ExpandToPidl().

◆ PIDLIsType()

static BOOL PIDLIsType ( LPCITEMIDLIST  pidl,
PIDLTYPE  type 
)
inlinestatic

Definition at line 421 of file brfolder.cpp.

422{
424 if (!data)
425 return FALSE;
426 return (data->type == type);
427}
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
LPPIDLDATA _ILGetDataPointer(LPCITEMIDLIST pidl)
Definition: pidl.c:2254

Referenced by BrFolder_CheckValidSelection().

◆ SHBrowseForFolderA()

EXTERN_C LPITEMIDLIST WINAPI SHBrowseForFolderA ( LPBROWSEINFOA  lpbi)

Definition at line 1338 of file brfolder.cpp.

1339{
1340 BROWSEINFOW bi;
1341 bi.hwndOwner = lpbi->hwndOwner;
1342 bi.pidlRoot = lpbi->pidlRoot;
1343
1345 bi.pszDisplayName = (lpbi->pszDisplayName ? szName : NULL);
1346
1347 CComHeapPtr<WCHAR> pszTitle;
1348 if (lpbi->lpszTitle)
1349 __SHCloneStrAtoW(&pszTitle, lpbi->lpszTitle);
1350 bi.lpszTitle = pszTitle;
1351
1352 bi.ulFlags = lpbi->ulFlags;
1353 bi.lpfn = lpbi->lpfn;
1354 bi.lParam = lpbi->lParam;
1355 bi.iImage = lpbi->iImage;
1357
1358 if (bi.pszDisplayName)
1360
1361 lpbi->iImage = bi.iImage;
1362 return pidl;
1363}
EXTERN_C LPITEMIDLIST WINAPI SHBrowseForFolderW(LPBROWSEINFOW lpbi)
Definition: brfolder.cpp:1370
INT WINAPI SHUnicodeToAnsi(LPCWSTR lpSrcStr, LPSTR lpDstStr, INT iLen)
Definition: string.c:2797
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
HWND hwndOwner
Definition: shlobj.h:1200

Referenced by test_click_make_new_folder_button(), and test_selection().

◆ SHBrowseForFolderW()

EXTERN_C LPITEMIDLIST WINAPI SHBrowseForFolderW ( LPBROWSEINFOW  lpbi)

Definition at line 1370 of file brfolder.cpp.

1371{
1372 TRACE("%p\n", lpbi);
1373
1374 // MSDN says the caller must initialize COM. We do it anyway in case the caller forgot.
1375 COleInit OleInit;
1376 BrFolder info = { lpbi };
1377
1381 if (ret == IDOK && !(lpbi->ulFlags & BIF_NOTRANSLATETARGETS) &&
1383 {
1384 PIDLIST_ABSOLUTE pidlTarget;
1385 if (SHELL_GetIDListTarget(info.pidlRet, &pidlTarget) == S_OK)
1386 {
1387 ILFree(info.pidlRet);
1388 info.pidlRet = pidlTarget;
1389 }
1390 }
1391 if (ret != IDOK)
1392 {
1393 ILFree(info.pidlRet);
1394 return NULL;
1395 }
1396
1397 return info.pidlRet;
1398}
static INT_PTR CALLBACK BrFolderDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: brfolder.cpp:1241
static UINT RosGetProcessEffectiveVersion(VOID)
Definition: compat_undoc.h:39
HRESULT SHELL_GetIDListTarget(_In_ LPCITEMIDLIST pidl, _Out_ PIDLIST_ABSOLUTE *ppidl)
Definition: utils.cpp:455
#define _WIN32_WINNT_WINXP
Definition: sdkddkver.h:22
#define BIF_NOTRANSLATETARGETS
Definition: shlobj.h:1228
#define IDD_BROWSE_FOR_FOLDER_NEW
Definition: shresdef.h:434
#define IDD_BROWSE_FOR_FOLDER
Definition: shresdef.h:433
OLE initialisation for drag drop support.
Definition: shellclasses.h:202
int32_t INT_PTR
Definition: typedefs.h:64
INT_PTR WINAPI DialogBoxParamW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM)

Referenced by CBandSiteMenu::_CreateNewISFBand(), BtrfsSend::AddClone(), CShellDispatch::BrowseForFolder(), BtrfsSend::BrowseParent(), ChooseFolder(), CHSourceDlgProc(), CCabFolder::ExtractFilesUI(), FileExtractDialogWndProc(), CZipExtract::CExtractSettingsPage::OnBrowse(), SHBrowseForFolderA(), SHBrowseForFolderWrapW(), and WelcomeDlgProc().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( shell  )

Variable Documentation

◆ g_layout_info