* - implement new dialog style resizing
*/
-#include "precomp.h"
+#define WIN32_NO_STATUS
+#define _INC_WINDOWS
+#define COBJMACROS
+#define NONAMELESSUNION
+#define NONAMELESSSTRUCT
+
+#include <windef.h>
+#include <winbase.h>
+#include <shlobj.h>
+#include <undocshell.h>
+#include <shellapi.h>
+#include <wine/debug.h>
+#include <wine/unicode.h>
+
+#include "pidl.h"
+#include "shell32_main.h"
+#include "shresdef.h"
+#include "shellfolder.h"
WINE_DEFAULT_DEBUG_CHANNEL(shell);
static const WCHAR szBrowseFolderInfo[] = L"__WINE_BRSFOLDERDLG_INFO";
-static DWORD __inline BrowseFlagsToSHCONTF(UINT ulFlags)
+static inline DWORD BrowseFlagsToSHCONTF(UINT ulFlags)
{
return SHCONTF_FOLDERS | (ulFlags & BIF_BROWSEINCLUDEFILES ? SHCONTF_NONFOLDERS : 0);
}
LPITEMIDLIST pidlParent, pidlChild;
HIMAGELIST hImageList;
HRESULT hr;
- CComPtr<IShellFolder> lpsfParent;
- CComPtr<IShellFolder> lpsfRoot;
- CComPtr<IEnumIDList> pEnumChildren;
+ IShellFolder *lpsfParent, *lpsfRoot;
+ IEnumIDList * pEnumChildren;
HTREEITEM item;
DWORD flags;
LPCITEMIDLIST root = info->lpBrowseInfo->pidlRoot;
{
hr = SHGetDesktopFolder(&lpsfParent);
} else {
- CComPtr<IShellFolder> lpsfDesktop;
+ IShellFolder *lpsfDesktop;
hr = SHGetDesktopFolder(&lpsfDesktop);
if (FAILED(hr)) {
WARN("SHGetDesktopFolder failed! hr = %08x\n", hr);
ILFree(pidlParent);
return;
}
- hr = lpsfDesktop->BindToObject(pidlParent, 0, IID_PPV_ARG(IShellFolder, &lpsfParent));
+ hr = IShellFolder_BindToObject(lpsfDesktop, pidlParent, 0, &IID_IShellFolder, (LPVOID*)&lpsfParent);
}
if (FAILED(hr)) {
}
if (pidlChild && pidlChild->mkid.cb) {
- hr = lpsfParent->BindToObject(pidlChild, 0, IID_PPV_ARG(IShellFolder, &lpsfRoot));
+ hr = IShellFolder_BindToObject(lpsfParent, pidlChild, 0, &IID_IShellFolder, (LPVOID*)&lpsfRoot);
} else {
lpsfRoot = lpsfParent;
}
}
flags = BrowseFlagsToSHCONTF( info->lpBrowseInfo->ulFlags );
- hr = lpsfRoot->EnumObjects(info->hWnd, flags, &pEnumChildren );
+ hr = IShellFolder_EnumObjects( lpsfRoot, info->hWnd, flags, &pEnumChildren );
if (FAILED(hr)) {
WARN("Could not get child iterator! hr = %08x\n", hr);
ILFree(pidlChild);
STRRET str;
TRACE("%p %p %x %p\n", lpsf, lpi, dwFlags, lpFriendlyName);
- if (SUCCEEDED(lpsf->GetDisplayNameOf(lpi, dwFlags, &str)))
+ if (SUCCEEDED(IShellFolder_GetDisplayNameOf(lpsf, lpi, dwFlags, &str)))
bSuccess = StrRetToStrNW(lpFriendlyName, MAX_PATH, &str, lpi);
else
bSuccess = FALSE;
tvi.cchTextMax = MAX_PATH;
tvi.lParam = (LPARAM)lptvid;
- lpsf->AddRef();
- pEnumIL->AddRef();
+ IShellFolder_AddRef(lpsf);
+ IEnumIDList_AddRef(pEnumIL);
lptvid->lpsfParent = lpsf;
lptvid->lpi = ILClone(pidl);
lptvid->lpifq = pidlParent ? ILCombine(pidlParent, pidl) : ILClone(pidl);
lptvid->pEnumIL = pEnumIL;
GetNormalAndSelectedIcons(lptvid->lpifq, &tvi);
- tvins.item = tvi;
+ tvins.u.item = tvi;
tvins.hInsertAfter = NULL;
tvins.hParent = hParent;
SetCapture( hwnd );
SetCursor( LoadCursorA( 0, (LPSTR)IDC_WAIT ) );
- while (S_OK == lpe->Next(1,&pidlTemp,&ulFetched))
+ while (S_OK == IEnumIDList_Next(lpe,1,&pidlTemp,&ulFetched))
{
ULONG ulAttrs = SFGAO_HASSUBFOLDER | SFGAO_FOLDER;
- CComPtr<IEnumIDList> pEnumIL;
- CComPtr<IShellFolder> pSFChild;
- lpsf->GetAttributesOf(1, (LPCITEMIDLIST*)&pidlTemp, &ulAttrs);
+ IEnumIDList* pEnumIL;
+ IShellFolder* pSFChild;
+ IShellFolder_GetAttributesOf(lpsf, 1, (LPCITEMIDLIST*)&pidlTemp, &ulAttrs);
if (ulAttrs & SFGAO_FOLDER)
{
- hr = lpsf->BindToObject(pidlTemp, NULL, IID_PPV_ARG(IShellFolder, &pSFChild));
+ hr = IShellFolder_BindToObject(lpsf,pidlTemp,NULL,&IID_IShellFolder,(LPVOID*)&pSFChild);
if (SUCCEEDED(hr))
{
DWORD flags = BrowseFlagsToSHCONTF(info->lpBrowseInfo->ulFlags);
- hr = pSFChild->EnumObjects(hwnd, flags, &pEnumIL);
+ hr = IShellFolder_EnumObjects(pSFChild, hwnd, flags, &pEnumIL);
if (hr == S_OK)
{
- if ((pEnumIL->Skip(1) != S_OK) ||
- FAILED(pEnumIL->Reset()))
+ if ((IEnumIDList_Skip(pEnumIL, 1) != S_OK) ||
+ FAILED(IEnumIDList_Reset(pEnumIL)))
{
pEnumIL = NULL;
}
SHFree(pidlTemp);
}
-static BOOL __inline PIDLIsType(LPCITEMIDLIST pidl, PIDLTYPE type)
+static inline BOOL PIDLIsType(LPCITEMIDLIST pidl, PIDLTYPE type)
{
LPPIDLDATA data = _ILGetDataPointer(pidl);
if (!data)
if (lpBrowseInfo->ulFlags & BIF_RETURNFSANCESTORS)
{
dwAttributes = SFGAO_FILESYSANCESTOR | SFGAO_FILESYSTEM;
- r = lptvid->lpsfParent->GetAttributesOf(1,
+ r = IShellFolder_GetAttributesOf(lptvid->lpsfParent, 1,
(LPCITEMIDLIST*)&lptvid->lpi, &dwAttributes);
if (FAILED(r) || !(dwAttributes & (SFGAO_FILESYSANCESTOR|SFGAO_FILESYSTEM)))
bEnabled = FALSE;
}
dwAttributes = SFGAO_FOLDER | SFGAO_FILESYSTEM;
- r = lptvid->lpsfParent->GetAttributesOf(1,
- (LPCITEMIDLIST*)&lptvid->lpi,
- &dwAttributes);
+ r = IShellFolder_GetAttributesOf(lptvid->lpsfParent,
+ 1,
+ (LPCITEMIDLIST*)&lptvid->lpi,
+ &dwAttributes);
if (FAILED(r) ||
((dwAttributes & (SFGAO_FOLDER|SFGAO_FILESYSTEM)) != (SFGAO_FOLDER|SFGAO_FILESYSTEM)))
{
TRACE("TVN_DELETEITEMA/W %p\n", lptvid);
- lptvid->lpsfParent->Release();
+ IShellFolder_Release(lptvid->lpsfParent);
if (lptvid->pEnumIL)
- lptvid->pEnumIL->Release();
+ IEnumIDList_Release(lptvid->pEnumIL);
SHFree(lptvid->lpi);
SHFree(lptvid->lpifq);
SHFree(lptvid);
static LRESULT BrsFolder_Treeview_Expand( browse_info *info, NMTREEVIEWW *pnmtv )
{
- CComPtr<IShellFolder> lpsf2;
+ IShellFolder *lpsf2;
LPTV_ITEMDATA lptvid = (LPTV_ITEMDATA) pnmtv->itemNew.lParam;
HRESULT r;
return 0;
if (lptvid->lpi && lptvid->lpi->mkid.cb) {
- r = lptvid->lpsfParent->BindToObject(lptvid->lpi, 0, IID_PPV_ARG(IShellFolder, &lpsf2));
+ r = IShellFolder_BindToObject(lptvid->lpsfParent, lptvid->lpi, 0, &IID_IShellFolder, (void**)&lpsf2);
} else {
lpsf2 = lptvid->lpsfParent;
- r = lpsf2->AddRef();
+ r = IShellFolder_AddRef(lpsf2);
}
if (SUCCEEDED(r))
{
FillTreeView( info, lpsf2, lptvid->lpifq, pnmtv->itemNew.hItem, lptvid->pEnumIL);
- lpsf2->Release();
+ IShellFolder_Release( lpsf2 );
}
/* My Computer is already sorted and trying to do a simple text
SHFree(item_data->lpifq);
SHFree(item_data->lpi);
item_data->lpifq = SHSimpleIDListFromPathW(new_path);
- item_data->lpsfParent->ParseDisplayName(NULL, NULL, pnmtv->item.pszText,
- NULL, &item_data->lpi, NULL);
+ IShellFolder_ParseDisplayName(item_data->lpsfParent, NULL, NULL, pnmtv->item.pszText,
+ NULL, &item_data->lpi, NULL);
item.mask = TVIF_HANDLE|TVIF_TEXT;
item.pszText = pnmtv->item.pszText;
static HRESULT BrsFolder_NewFolder(browse_info *info)
{
DWORD flags = BrowseFlagsToSHCONTF(info->lpBrowseInfo->ulFlags);
- CComPtr<IShellFolder> desktop;
- CComPtr<IShellFolder> cur;
- CComPtr<ISFHelper> sfhelper;
+ IShellFolder *desktop, *cur;
+ ISFHelper *sfhelper;
WCHAR name[MAX_PATH];
HTREEITEM parent, added;
LPTV_ITEMDATA item_data;
hr = SHGetDesktopFolder(&desktop);
if(FAILED(hr))
return hr;
- hr = desktop->BindToObject(info->pidlRet, 0, IID_PPV_ARG(IShellFolder, &cur));
+ hr = IShellFolder_BindToObject(desktop, info->pidlRet, 0, &IID_IShellFolder, (void**)&cur);
if(FAILED(hr))
return hr;
- hr = cur->QueryInterface(IID_PPV_ARG(ISFHelper, &sfhelper));
+ hr = IShellFolder_QueryInterface(cur, &IID_ISFHelper, (void**)&sfhelper);
if(FAILED(hr))
return hr;
len = strlenW(name);
if(len<MAX_PATH)
name[len++] = '\\';
- hr = sfhelper->GetUniqueName(&name[len], MAX_PATH-len);
+ hr = ISFHelper_GetUniqueName(sfhelper, &name[len], MAX_PATH-len);
if(FAILED(hr))
goto cleanup;
goto cleanup;
if(item_data->pEnumIL)
- item_data->pEnumIL->Release();
- hr = cur->EnumObjects(info->hwndTreeView, flags, &item_data->pEnumIL);
+ IEnumIDList_Release(item_data->pEnumIL);
+ hr = IShellFolder_EnumObjects(cur, info->hwndTreeView, flags, &item_data->pEnumIL);
if(FAILED(hr))
goto cleanup;
SendMessageW(info->hwndTreeView, TVM_SETITEMW, 0, (LPARAM)&item);
}
- hr = cur->ParseDisplayName(NULL, NULL, name+len, NULL, &new_item, NULL);
+ hr = IShellFolder_ParseDisplayName(cur, NULL, NULL, name+len, NULL, &new_item, NULL);
if(FAILED(hr))
goto cleanup;
/* If 'selection' is a string, convert to a Shell ID List. */
if (is_str) {
- CComPtr<IShellFolder> psfDesktop;
+ IShellFolder *psfDesktop;
HRESULT hr;
hr = SHGetDesktopFolder(&psfDesktop);
if (FAILED(hr))
goto done;
- hr = psfDesktop->ParseDisplayName(NULL, NULL, (LPOLESTR)selection,
- NULL, &pidlSelection, NULL);
+ hr = IShellFolder_ParseDisplayName(psfDesktop, NULL, NULL, (LPOLESTR)selection,
+ NULL, &pidlSelection, NULL);
if (FAILED(hr))
goto done;
}