From fa1e20e89fa61a6cab3f77c1439375b2d40216cd Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Thu, 15 May 2008 17:50:05 -0700 Subject: [PATCH] shell32: implement make new folder functionality. --- dlls/shell32/brsfolder.c | 78 +++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 74 insertions(+), 4 deletions(-) diff --git a/dlls/shell32/brsfolder.c b/dlls/shell32/brsfolder.c index 45e7519..fab974d 100644 --- a/dlls/shell32/brsfolder.c +++ b/dlls/shell32/brsfolder.c @@ -35,6 +35,7 @@ #include "pidl.h" #include "shell32_main.h" #include "shellapi.h" +#include "shellfolder.h" #include "shresdef.h" WINE_DEFAULT_DEBUG_CHANNEL(shell); @@ -499,8 +500,6 @@ static BOOL BrsFolder_OnCreate( HWND hWnd, browse_info *info ) info->hWnd = hWnd; SetPropW( hWnd, szBrowseFolderInfo, info ); - if (lpBrowseInfo->ulFlags & BIF_NEWDIALOGSTYLE) - FIXME("flags BIF_NEWDIALOGSTYLE partially implemented\n"); if (lpBrowseInfo->ulFlags & ~SUPPORTEDFLAGS) FIXME("flags %x not implemented\n", lpBrowseInfo->ulFlags & ~SUPPORTEDFLAGS); @@ -548,6 +547,78 @@ static BOOL BrsFolder_OnCreate( HWND hWnd, browse_info *info ) return TRUE; } +static BOOL BrsFolder_MakeNewFolder(browse_info *info) +{ + HRESULT hr; + ISFHelper *psfhlp = NULL; + IShellFolder *psfDesktop; + IShellFolder *psfFolder; + LPITEMIDLIST pidlFolder; + int error = 0; + + hr = SHGetDesktopFolder(&psfDesktop); + if (FAILED(hr)) + { + error = 1; + goto make_new_folder_done; + } + if (_ILIsDesktop(info->pidlRet)) + { + psfFolder = psfDesktop; + } + else + { + /* get IShellFolder */ + hr = IShellFolder_BindToObject(psfDesktop, info->pidlRet, NULL, &IID_IShellFolder, (void**)&psfFolder); + IShellFolder_Release(psfDesktop); + if (FAILED(hr)) + { + error = 1; + goto make_new_folder_done; + } + } + + hr = IShellFolder_QueryInterface(psfFolder, &IID_ISFHelper, (LPVOID*)&psfhlp); + if (SUCCEEDED(hr) && psfhlp) + { + WCHAR wszName[MAX_PATH]; + + /* create new folder */ + hr = ISFHelper_GetUniqueName(psfhlp, wszName, MAX_PATH); + if (SUCCEEDED(hr)) + hr = ISFHelper_AddFolder(psfhlp, 0, wszName, &pidlFolder); + /* silently fail here, otherwise we get two message boxes */ + if (FAILED(hr)) + goto make_new_folder_done; + } + else + { + error = 2; + goto make_new_folder_done; + } + +make_new_folder_done: + if (error) + { + switch (error) + { + case 1: + MessageBoxA(info->hWnd, "Unexpected Error.", "Error", MB_OK|MB_ICONEXCLAMATION); + break; + + case 2: + MessageBoxA(info->hWnd, "You cannot create a new folder here. Choose a different location.", "Invalid location", MB_OK|MB_ICONEXCLAMATION); + break; + + default: + break; + } + } + + IShellFolder_Release(psfFolder); + return TRUE; +} + static BOOL BrsFolder_OnCommand( browse_info *info, UINT id ) { LPBROWSEINFOW lpBrowseInfo = info->lpBrowseInfo; @@ -570,8 +641,7 @@ static BOOL BrsFolder_OnCommand( browse_info *info, UINT id ) return TRUE; case IDD_MAKENEWFOLDER: - FIXME("make new folder not implemented\n"); - return TRUE; + return BrsFolder_MakeNewFolder(info); } return FALSE; } -- 1.5.2.2