- better error check when importing functions via GetProcAdress
- replaced SHGetSpecialFolderPath (not aviable in all shell32 versions) - changed call order when browsing to different folder (crash with native shell) - removed Move call since IShellview_CreateViewWindow creates it already in the right rect
This commit is contained in:
parent
3e56dbc9a4
commit
3de41ceb42
|
@ -110,7 +110,8 @@ extern DWORD (WINAPI *COMDLG32_SHGetFileInfoA)(LPCSTR,DWORD,SHFILEINFOA*,UINT,UI
|
||||||
extern LPVOID (WINAPI *COMDLG32_SHAlloc)(DWORD);
|
extern LPVOID (WINAPI *COMDLG32_SHAlloc)(DWORD);
|
||||||
extern DWORD (WINAPI *COMDLG32_SHFree)(LPVOID);
|
extern DWORD (WINAPI *COMDLG32_SHFree)(LPVOID);
|
||||||
extern HRESULT (WINAPI *COMDLG32_SHGetDataFromIDListA)(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, int nFormat, LPVOID dest, int len);
|
extern HRESULT (WINAPI *COMDLG32_SHGetDataFromIDListA)(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, int nFormat, LPVOID dest, int len);
|
||||||
extern BOOL (WINAPI *COMDLG32_SHGetSpecialFolderPathA)(HWND hwndOwner,LPSTR szPath,DWORD csidl,BOOL bCreate);
|
extern BOOL (WINAPI *COMDLG32_SHGetFolderPathA)(HWND,int,HANDLE,DWORD,LPSTR);
|
||||||
|
|
||||||
|
|
||||||
/* PATH */
|
/* PATH */
|
||||||
extern BOOL (WINAPI *COMDLG32_PathIsRootA)(LPCSTR x);
|
extern BOOL (WINAPI *COMDLG32_PathIsRootA)(LPCSTR x);
|
||||||
|
|
|
@ -25,9 +25,10 @@ static int COMDLG32_Attach = 0;
|
||||||
HINSTANCE COMCTL32_hInstance = 0;
|
HINSTANCE COMCTL32_hInstance = 0;
|
||||||
HINSTANCE SHELL32_hInstance = 0;
|
HINSTANCE SHELL32_hInstance = 0;
|
||||||
HINSTANCE SHLWAPI_hInstance = 0;
|
HINSTANCE SHLWAPI_hInstance = 0;
|
||||||
|
HINSTANCE SHFOLDER_hInstance = 0;
|
||||||
|
|
||||||
/* IMAGELIST */
|
/* IMAGELIST */
|
||||||
BOOL (WINAPI* COMDLG32_ImageList_Draw) (HIMAGELIST himl, int i, HDC hdcDest, int x, int y, UINT fStyle);
|
BOOL (WINAPI* COMDLG32_ImageList_Draw) (HIMAGELIST himl, int i, HDC hdcDest, int x, int y, UINT fStyle);
|
||||||
|
|
||||||
/* ITEMIDLIST */
|
/* ITEMIDLIST */
|
||||||
LPITEMIDLIST (WINAPI *COMDLG32_PIDL_ILClone) (LPCITEMIDLIST);
|
LPITEMIDLIST (WINAPI *COMDLG32_PIDL_ILClone) (LPCITEMIDLIST);
|
||||||
|
@ -46,7 +47,7 @@ DWORD (WINAPI *COMDLG32_SHFree)(LPVOID);
|
||||||
HRESULT (WINAPI *COMDLG32_SHGetDataFromIDListA)(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, int nFormat, LPVOID dest, int len);
|
HRESULT (WINAPI *COMDLG32_SHGetDataFromIDListA)(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, int nFormat, LPVOID dest, int len);
|
||||||
HRESULT (WINAPI *COMDLG32_StrRetToBufA)(LPSTRRET,LPITEMIDLIST,LPSTR,DWORD);
|
HRESULT (WINAPI *COMDLG32_StrRetToBufA)(LPSTRRET,LPITEMIDLIST,LPSTR,DWORD);
|
||||||
HRESULT (WINAPI *COMDLG32_StrRetToBufW)(LPSTRRET,LPITEMIDLIST,LPWSTR,DWORD);
|
HRESULT (WINAPI *COMDLG32_StrRetToBufW)(LPSTRRET,LPITEMIDLIST,LPWSTR,DWORD);
|
||||||
BOOL (WINAPI *COMDLG32_SHGetSpecialFolderPathA)(HWND hwndOwner,LPSTR szPath,DWORD csidl,BOOL bCreate);
|
BOOL (WINAPI *COMDLG32_SHGetFolderPathA)(HWND,int,HANDLE,DWORD,LPSTR);
|
||||||
|
|
||||||
/* PATH */
|
/* PATH */
|
||||||
BOOL (WINAPI *COMDLG32_PathIsRootA)(LPCSTR x);
|
BOOL (WINAPI *COMDLG32_PathIsRootA)(LPCSTR x);
|
||||||
|
@ -71,6 +72,14 @@ BOOL (WINAPI *COMDLG32_PathAddExtensionA)(LPSTR pszPath,LPCSTR pszExtension);
|
||||||
* FALSE if sibling could not be loaded or instantiated twice, TRUE
|
* FALSE if sibling could not be loaded or instantiated twice, TRUE
|
||||||
* otherwise.
|
* otherwise.
|
||||||
*/
|
*/
|
||||||
|
static char * GPA_string = "Failed to get entry point %s for hinst = 0x%08x\n";
|
||||||
|
#define GPA(dest, hinst, name) \
|
||||||
|
if(!(dest = (void*)GetProcAddress(hinst,name)))\
|
||||||
|
{ \
|
||||||
|
ERR(GPA_string, debugres_a(name), hinst); \
|
||||||
|
return FALSE; \
|
||||||
|
}
|
||||||
|
|
||||||
BOOL WINAPI COMDLG32_DllEntryPoint(HINSTANCE hInstance, DWORD Reason, LPVOID Reserved)
|
BOOL WINAPI COMDLG32_DllEntryPoint(HINSTANCE hInstance, DWORD Reason, LPVOID Reserved)
|
||||||
{
|
{
|
||||||
TRACE("(%08x, %08lx, %p)\n", hInstance, Reason, Reserved);
|
TRACE("(%08x, %08lx, %p)\n", hInstance, Reason, Reserved);
|
||||||
|
@ -115,28 +124,32 @@ BOOL WINAPI COMDLG32_DllEntryPoint(HINSTANCE hInstance, DWORD Reason, LPVOID Res
|
||||||
}
|
}
|
||||||
|
|
||||||
/* IMAGELIST */
|
/* IMAGELIST */
|
||||||
COMDLG32_ImageList_Draw=(void*)GetProcAddress(COMCTL32_hInstance,"ImageList_Draw");
|
GPA(COMDLG32_ImageList_Draw, COMCTL32_hInstance,"ImageList_Draw");
|
||||||
|
|
||||||
/* ITEMISLIST */
|
/* ITEMIDLIST */
|
||||||
|
GPA(COMDLG32_PIDL_ILIsEqual, SHELL32_hInstance, (LPCSTR)21L);
|
||||||
COMDLG32_PIDL_ILIsEqual =(void*)GetProcAddress(SHELL32_hInstance, (LPCSTR)21L);
|
GPA(COMDLG32_PIDL_ILCombine, SHELL32_hInstance, (LPCSTR)25L);
|
||||||
COMDLG32_PIDL_ILCombine =(void*)GetProcAddress(SHELL32_hInstance, (LPCSTR)25L);
|
GPA(COMDLG32_PIDL_ILGetNext, SHELL32_hInstance, (LPCSTR)153L);
|
||||||
COMDLG32_PIDL_ILGetNext =(void*)GetProcAddress(SHELL32_hInstance, (LPCSTR)153L);
|
GPA(COMDLG32_PIDL_ILClone, SHELL32_hInstance, (LPCSTR)18L);
|
||||||
COMDLG32_PIDL_ILClone =(void*)GetProcAddress(SHELL32_hInstance, (LPCSTR)18L);
|
GPA(COMDLG32_PIDL_ILRemoveLastID, SHELL32_hInstance, (LPCSTR)17L);
|
||||||
COMDLG32_PIDL_ILRemoveLastID =(void*)GetProcAddress(SHELL32_hInstance, (LPCSTR)17L);
|
|
||||||
|
|
||||||
/* SHELL */
|
/* SHELL */
|
||||||
|
|
||||||
COMDLG32_SHAlloc = (void*)GetProcAddress(SHELL32_hInstance, (LPCSTR)196L);
|
GPA(COMDLG32_SHAlloc, SHELL32_hInstance, (LPCSTR)196L);
|
||||||
COMDLG32_SHFree = (void*)GetProcAddress(SHELL32_hInstance, (LPCSTR)195L);
|
GPA(COMDLG32_SHFree, SHELL32_hInstance, (LPCSTR)195L);
|
||||||
COMDLG32_SHGetSpecialFolderLocation = (void*)GetProcAddress(SHELL32_hInstance,"SHGetSpecialFolderLocation");
|
GPA(COMDLG32_SHGetSpecialFolderLocation, SHELL32_hInstance,"SHGetSpecialFolderLocation");
|
||||||
COMDLG32_SHGetPathFromIDListA = (void*)GetProcAddress(SHELL32_hInstance,"SHGetPathFromIDListA");
|
GPA(COMDLG32_SHGetPathFromIDListA, SHELL32_hInstance,"SHGetPathFromIDListA");
|
||||||
COMDLG32_SHGetDesktopFolder = (void*)GetProcAddress(SHELL32_hInstance,"SHGetDesktopFolder");
|
GPA(COMDLG32_SHGetDesktopFolder, SHELL32_hInstance,"SHGetDesktopFolder");
|
||||||
COMDLG32_SHGetFileInfoA = (void*)GetProcAddress(SHELL32_hInstance,"SHGetFileInfoA");
|
GPA(COMDLG32_SHGetFileInfoA, SHELL32_hInstance,"SHGetFileInfoA");
|
||||||
COMDLG32_SHGetDataFromIDListA = (void*)GetProcAddress(SHELL32_hInstance,"SHGetDataFromIDListA");
|
GPA(COMDLG32_SHGetDataFromIDListA, SHELL32_hInstance,"SHGetDataFromIDListA");
|
||||||
|
|
||||||
/* FIXME: we cant import SHGetSpecialFolderPathA from all versions of shell32 */
|
/* for the first versions of shell32 SHGetFolderPathA is in SHFOLDER.DLL */
|
||||||
COMDLG32_SHGetSpecialFolderPathA = (void*)GetProcAddress(SHELL32_hInstance,"SHGetSpecialFolderPathA");
|
COMDLG32_SHGetFolderPathA = (void*)GetProcAddress(SHELL32_hInstance,"SHGetFolderPathA");
|
||||||
|
if (!COMDLG32_SHGetFolderPathA)
|
||||||
|
{
|
||||||
|
SHFOLDER_hInstance = LoadLibraryA("SHFOLDER.DLL");
|
||||||
|
GPA(COMDLG32_SHGetFolderPathA, SHFOLDER_hInstance,"SHGetFolderPathA");
|
||||||
|
}
|
||||||
|
|
||||||
/* ### WARINIG ###
|
/* ### WARINIG ###
|
||||||
We can't do a GetProcAddress to link to StrRetToBuf[A|W] sine not all
|
We can't do a GetProcAddress to link to StrRetToBuf[A|W] sine not all
|
||||||
|
@ -146,18 +159,18 @@ BOOL WINAPI COMDLG32_DllEntryPoint(HINSTANCE hInstance, DWORD Reason, LPVOID Res
|
||||||
so it won't break the use of any combination of native and buildin dll's (jsch) */
|
so it won't break the use of any combination of native and buildin dll's (jsch) */
|
||||||
|
|
||||||
/* PATH */
|
/* PATH */
|
||||||
COMDLG32_PathMatchSpecW = (void*)GetProcAddress(SHLWAPI_hInstance,"PathMatchSpecW");
|
GPA(COMDLG32_PathMatchSpecW, SHLWAPI_hInstance,"PathMatchSpecW");
|
||||||
COMDLG32_PathIsRootA = (void*)GetProcAddress(SHLWAPI_hInstance,"PathIsRootA");
|
GPA(COMDLG32_PathIsRootA, SHLWAPI_hInstance,"PathIsRootA");
|
||||||
COMDLG32_PathRemoveFileSpecA = (void*)GetProcAddress(SHLWAPI_hInstance,"PathRemoveFileSpecA");
|
GPA(COMDLG32_PathRemoveFileSpecA, SHLWAPI_hInstance,"PathRemoveFileSpecA");
|
||||||
COMDLG32_PathFindFileNameA = (void*)GetProcAddress(SHLWAPI_hInstance,"PathFindFileNameA");
|
GPA(COMDLG32_PathFindFileNameA, SHLWAPI_hInstance,"PathFindFileNameA");
|
||||||
COMDLG32_PathAddBackslashA = (void*)GetProcAddress(SHLWAPI_hInstance,"PathAddBackslashA");
|
GPA(COMDLG32_PathAddBackslashA, SHLWAPI_hInstance,"PathAddBackslashA");
|
||||||
COMDLG32_PathCanonicalizeA = (void*)GetProcAddress(SHLWAPI_hInstance,"PathCanonicalizeA");
|
GPA(COMDLG32_PathCanonicalizeA, SHLWAPI_hInstance,"PathCanonicalizeA");
|
||||||
COMDLG32_PathGetDriveNumberA = (void*)GetProcAddress(SHLWAPI_hInstance,"PathGetDriveNumberA");
|
GPA(COMDLG32_PathGetDriveNumberA, SHLWAPI_hInstance,"PathGetDriveNumberA");
|
||||||
COMDLG32_PathIsRelativeA = (void*)GetProcAddress(SHLWAPI_hInstance,"PathIsRelativeA");
|
GPA(COMDLG32_PathIsRelativeA, SHLWAPI_hInstance,"PathIsRelativeA");
|
||||||
COMDLG32_PathFindNextComponentA = (void*)GetProcAddress(SHLWAPI_hInstance,"PathFindNextComponentA");
|
GPA(COMDLG32_PathFindNextComponentA, SHLWAPI_hInstance,"PathFindNextComponentA");
|
||||||
COMDLG32_PathAddBackslashW = (void*)GetProcAddress(SHLWAPI_hInstance,"PathAddBackslashW");
|
GPA(COMDLG32_PathAddBackslashW, SHLWAPI_hInstance,"PathAddBackslashW");
|
||||||
COMDLG32_PathFindExtensionA = (void*)GetProcAddress(SHLWAPI_hInstance,"PathFindExtensionA");
|
GPA(COMDLG32_PathFindExtensionA, SHLWAPI_hInstance,"PathFindExtensionA");
|
||||||
COMDLG32_PathAddExtensionA = (void*)GetProcAddress(SHLWAPI_hInstance,"PathAddExtensionA");
|
GPA(COMDLG32_PathAddExtensionA, SHLWAPI_hInstance,"PathAddExtensionA");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DLL_PROCESS_DETACH:
|
case DLL_PROCESS_DETACH:
|
||||||
|
@ -169,13 +182,15 @@ BOOL WINAPI COMDLG32_DllEntryPoint(HINSTANCE hInstance, DWORD Reason, LPVOID Res
|
||||||
COMDLG32_hInstance = 0;
|
COMDLG32_hInstance = 0;
|
||||||
if(COMDLG32_hInstance16)
|
if(COMDLG32_hInstance16)
|
||||||
FreeLibrary16(COMDLG32_hInstance16);
|
FreeLibrary16(COMDLG32_hInstance16);
|
||||||
|
if(SHFOLDER_hInstance)
|
||||||
|
FreeLibrary(SHFOLDER_hInstance);
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
#undef GPA
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* COMDLG32_AllocMem (internal)
|
* COMDLG32_AllocMem (internal)
|
||||||
|
|
|
@ -1036,7 +1036,7 @@ static LRESULT FILEDLG95_InitUI(HWND hwnd)
|
||||||
/* change Open to Save FIXME: use resources */
|
/* change Open to Save FIXME: use resources */
|
||||||
if (fodInfos->DlgInfos.dwDlgProp & FODPROP_SAVEDLG)
|
if (fodInfos->DlgInfos.dwDlgProp & FODPROP_SAVEDLG)
|
||||||
{
|
{
|
||||||
SetDlgItemTextA(hwnd,IDOK,"Save");
|
SetDlgItemTextA(hwnd,IDOK,"&Save");
|
||||||
SetDlgItemTextA(hwnd,IDC_LOOKINSTATIC,"Save &in");
|
SetDlgItemTextA(hwnd,IDC_LOOKINSTATIC,"Save &in");
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1178,8 +1178,11 @@ BOOL FILEDLG95_OnOpen(HWND hwnd)
|
||||||
if (!COMDLG32_SHGetPathFromIDListA(fodInfos->ShellInfos.pidlAbsCurrent, lpstrPathAndFile))
|
if (!COMDLG32_SHGetPathFromIDListA(fodInfos->ShellInfos.pidlAbsCurrent, lpstrPathAndFile))
|
||||||
{
|
{
|
||||||
/* we are in a special folder, default to desktop */
|
/* we are in a special folder, default to desktop */
|
||||||
COMDLG32_SHGetSpecialFolderPathA(hwnd, lpstrPathAndFile, CSIDL_DESKTOPDIRECTORY, FALSE);
|
if(FAILED(COMDLG32_SHGetFolderPathA(hwnd, CSIDL_DESKTOPDIRECTORY|CSIDL_FLAG_CREATE, NULL, 0, lpstrPathAndFile)))
|
||||||
FIXME("special folder not handled, use desktop\n");
|
{
|
||||||
|
/* last fallback */
|
||||||
|
GetCurrentDirectoryA(MAX_PATH, lpstrPathAndFile);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
COMDLG32_PathAddBackslashA(lpstrPathAndFile);
|
COMDLG32_PathAddBackslashA(lpstrPathAndFile);
|
||||||
|
|
||||||
|
|
|
@ -108,8 +108,7 @@ IShellBrowser * IShellBrowserImpl_Construct(HWND hwndOwner)
|
||||||
sb->lpVtbl = &IShellBrowserImpl_Vtbl;
|
sb->lpVtbl = &IShellBrowserImpl_Vtbl;
|
||||||
sb->lpVtbl2 = &IShellBrowserImpl_ICommDlgBrowser_Vtbl;
|
sb->lpVtbl2 = &IShellBrowserImpl_ICommDlgBrowser_Vtbl;
|
||||||
|
|
||||||
COMDLG32_SHGetSpecialFolderLocation(hwndOwner,
|
COMDLG32_SHGetSpecialFolderLocation(hwndOwner, CSIDL_DESKTOP,
|
||||||
CSIDL_DESKTOP,
|
|
||||||
&fodInfos->ShellInfos.pidlAbsCurrent);
|
&fodInfos->ShellInfos.pidlAbsCurrent);
|
||||||
|
|
||||||
TRACE("%p\n", sb);
|
TRACE("%p\n", sb);
|
||||||
|
@ -257,6 +256,9 @@ HRESULT WINAPI IShellBrowserImpl_BrowseObject(IShellBrowser *iface,
|
||||||
IShellView *psvTmp;
|
IShellView *psvTmp;
|
||||||
FileOpenDlgInfos *fodInfos;
|
FileOpenDlgInfos *fodInfos;
|
||||||
LPITEMIDLIST pidlTmp;
|
LPITEMIDLIST pidlTmp;
|
||||||
|
HWND hwndView;
|
||||||
|
HWND hDlgWnd;
|
||||||
|
BOOL bViewHasFocus;
|
||||||
|
|
||||||
ICOM_THIS(IShellBrowserImpl, iface);
|
ICOM_THIS(IShellBrowserImpl, iface);
|
||||||
|
|
||||||
|
@ -269,24 +271,19 @@ HRESULT WINAPI IShellBrowserImpl_BrowseObject(IShellBrowser *iface,
|
||||||
{
|
{
|
||||||
|
|
||||||
/* SBSP_RELATIVE A relative pidl (relative from the current folder) */
|
/* SBSP_RELATIVE A relative pidl (relative from the current folder) */
|
||||||
hRes = IShellFolder_BindToObject(fodInfos->Shell.FOIShellFolder,
|
if(FAILED(hRes = IShellFolder_BindToObject(fodInfos->Shell.FOIShellFolder,
|
||||||
pidl,
|
pidl, NULL, &IID_IShellFolder, (LPVOID *)&psfTmp)))
|
||||||
NULL,
|
|
||||||
&IID_IShellFolder,
|
|
||||||
(LPVOID *)&psfTmp);
|
|
||||||
if(FAILED(hRes))
|
|
||||||
{
|
{
|
||||||
return hRes;
|
ERR("bind to object failed\n");
|
||||||
|
return hRes;
|
||||||
}
|
}
|
||||||
/* create an absolute pidl */
|
/* create an absolute pidl */
|
||||||
pidlTmp = COMDLG32_PIDL_ILCombine(fodInfos->ShellInfos.pidlAbsCurrent,
|
pidlTmp = COMDLG32_PIDL_ILCombine(fodInfos->ShellInfos.pidlAbsCurrent,
|
||||||
(LPITEMIDLIST)pidl);
|
(LPITEMIDLIST)pidl);
|
||||||
|
|
||||||
}
|
}
|
||||||
else if(wFlags & SBSP_PARENT)
|
else if(wFlags & SBSP_PARENT)
|
||||||
{
|
{
|
||||||
/* Browse the parent folder (ignores the pidl) */
|
/* Browse the parent folder (ignores the pidl) */
|
||||||
|
|
||||||
pidlTmp = GetParentPidl(fodInfos->ShellInfos.pidlAbsCurrent);
|
pidlTmp = GetParentPidl(fodInfos->ShellInfos.pidlAbsCurrent);
|
||||||
psfTmp = GetShellFolderFromPidl(pidlTmp);
|
psfTmp = GetShellFolderFromPidl(pidlTmp);
|
||||||
|
|
||||||
|
@ -298,11 +295,7 @@ HRESULT WINAPI IShellBrowserImpl_BrowseObject(IShellBrowser *iface,
|
||||||
psfTmp = GetShellFolderFromPidl(pidlTmp);
|
psfTmp = GetShellFolderFromPidl(pidlTmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!psfTmp) return E_FAIL;
|
||||||
|
|
||||||
/* Retrieve the IShellFolder interface of the pidl specified folder */
|
|
||||||
if(!psfTmp)
|
|
||||||
return E_FAIL;
|
|
||||||
|
|
||||||
/* If the pidl to browse to is equal to the actual pidl ...
|
/* If the pidl to browse to is equal to the actual pidl ...
|
||||||
do nothing and pretend you did it*/
|
do nothing and pretend you did it*/
|
||||||
|
@ -320,82 +313,55 @@ HRESULT WINAPI IShellBrowserImpl_BrowseObject(IShellBrowser *iface,
|
||||||
fodInfos->Shell.FOIDataObject = NULL;
|
fodInfos->Shell.FOIDataObject = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Release the current fodInfos->Shell.FOIShellFolder and update its value */
|
/* Create the associated view */
|
||||||
|
if(FAILED(hRes = IShellFolder_CreateViewObject(psfTmp, fodInfos->ShellInfos.hwndOwner,
|
||||||
|
&IID_IShellView, (LPVOID *)&psvTmp))) return hRes;
|
||||||
|
|
||||||
|
/* Check if listview has focus */
|
||||||
|
bViewHasFocus = IsChild(fodInfos->ShellInfos.hwndView,GetFocus());
|
||||||
|
|
||||||
|
/* Get the foldersettings from the old view */
|
||||||
|
if(fodInfos->Shell.FOIShellView)
|
||||||
|
IShellView_GetCurrentInfo(fodInfos->Shell.FOIShellView, &fodInfos->ShellInfos.folderSettings);
|
||||||
|
|
||||||
|
/* Release the old fodInfos->Shell.FOIShellView and update its value.
|
||||||
|
We have to update this early since ShellView_CreateViewWindow of native
|
||||||
|
shell32 calls OnStateChange and needs the correct view here.*/
|
||||||
|
if(fodInfos->Shell.FOIShellView)
|
||||||
|
{
|
||||||
|
IShellView_DestroyViewWindow(fodInfos->Shell.FOIShellView);
|
||||||
|
IShellView_Release(fodInfos->Shell.FOIShellView);
|
||||||
|
}
|
||||||
|
fodInfos->Shell.FOIShellView = psvTmp;
|
||||||
|
|
||||||
|
/* Release old FOIShellFolder and update its value */
|
||||||
if (fodInfos->Shell.FOIShellFolder)
|
if (fodInfos->Shell.FOIShellFolder)
|
||||||
IShellFolder_Release(fodInfos->Shell.FOIShellFolder);
|
IShellFolder_Release(fodInfos->Shell.FOIShellFolder);
|
||||||
fodInfos->Shell.FOIShellFolder = psfTmp;
|
fodInfos->Shell.FOIShellFolder = psfTmp;
|
||||||
|
|
||||||
/* Create the associated view */
|
/* Release old pidlAbsCurrent and update its value */
|
||||||
if(SUCCEEDED(hRes = IShellFolder_CreateViewObject(psfTmp,
|
COMDLG32_SHFree((LPVOID)fodInfos->ShellInfos.pidlAbsCurrent);
|
||||||
fodInfos->ShellInfos.hwndOwner,
|
fodInfos->ShellInfos.pidlAbsCurrent = pidlTmp;
|
||||||
&IID_IShellView,
|
|
||||||
(LPVOID *)&psvTmp)))
|
|
||||||
{
|
|
||||||
HWND hwndView;
|
|
||||||
HWND hDlgWnd;
|
|
||||||
BOOL bViewHasFocus;
|
|
||||||
|
|
||||||
/* Check if listview has focus */
|
/* Create the window */
|
||||||
bViewHasFocus = IsChild(fodInfos->ShellInfos.hwndView,GetFocus());
|
TRACE("create view window\n");
|
||||||
|
if(FAILED(hRes = IShellView_CreateViewWindow(psvTmp, NULL,
|
||||||
|
&fodInfos->ShellInfos.folderSettings, fodInfos->Shell.FOIShellBrowser,
|
||||||
|
&fodInfos->ShellInfos.rectView, &hwndView))) return hRes;
|
||||||
|
|
||||||
/* Get the foldersettings from the old view */
|
fodInfos->ShellInfos.hwndView = hwndView;
|
||||||
if(fodInfos->Shell.FOIShellView)
|
|
||||||
{
|
|
||||||
IShellView_GetCurrentInfo(fodInfos->Shell.FOIShellView,
|
|
||||||
&fodInfos->ShellInfos.folderSettings);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Create the window */
|
|
||||||
if(SUCCEEDED(hRes = IShellView_CreateViewWindow(psvTmp,
|
|
||||||
NULL,
|
|
||||||
&fodInfos->ShellInfos.folderSettings,
|
|
||||||
fodInfos->Shell.FOIShellBrowser,
|
|
||||||
&fodInfos->ShellInfos.rectView,
|
|
||||||
&hwndView)))
|
|
||||||
{
|
|
||||||
/* Fit the created view in the appropriate RECT */
|
|
||||||
MoveWindow(hwndView,
|
|
||||||
fodInfos->ShellInfos.rectView.left,
|
|
||||||
fodInfos->ShellInfos.rectView.top,
|
|
||||||
fodInfos->ShellInfos.rectView.right-fodInfos->ShellInfos.rectView.left,
|
|
||||||
fodInfos->ShellInfos.rectView.bottom-fodInfos->ShellInfos.rectView.top,
|
|
||||||
FALSE);
|
|
||||||
|
|
||||||
/* Select the new folder in the Look In combo box of the Open file dialog */
|
|
||||||
|
|
||||||
FILEDLG95_LOOKIN_SelectItem(fodInfos->DlgInfos.hwndLookInCB,pidlTmp);
|
|
||||||
|
|
||||||
/* Release old pidlAbsCurrent memory and update its value */
|
|
||||||
COMDLG32_SHFree((LPVOID)fodInfos->ShellInfos.pidlAbsCurrent);
|
|
||||||
fodInfos->ShellInfos.pidlAbsCurrent = pidlTmp;
|
|
||||||
|
|
||||||
/* Release the current fodInfos->Shell.FOIShellView and update its value */
|
|
||||||
if(fodInfos->Shell.FOIShellView)
|
|
||||||
{
|
|
||||||
IShellView_DestroyViewWindow(fodInfos->Shell.FOIShellView);
|
|
||||||
IShellView_Release(fodInfos->Shell.FOIShellView);
|
|
||||||
}
|
|
||||||
#if 0
|
|
||||||
ShowWindow(fodInfos->ShellInfos.hwndView,SW_HIDE);
|
|
||||||
#endif
|
|
||||||
fodInfos->Shell.FOIShellView = psvTmp;
|
|
||||||
|
|
||||||
fodInfos->ShellInfos.hwndView = hwndView;
|
|
||||||
|
|
||||||
/* changes the tab order of the ListView to reflect the window's File Dialog */
|
|
||||||
hDlgWnd = GetDlgItem(GetParent(hwndView), IDC_LOOKIN);
|
|
||||||
SetWindowPos(hwndView, hDlgWnd, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE);
|
|
||||||
|
|
||||||
/* Since we destroyed the old view if it had focus set focus
|
|
||||||
to the newly created view */
|
|
||||||
if (bViewHasFocus)
|
|
||||||
SetFocus(fodInfos->ShellInfos.hwndView);
|
|
||||||
|
|
||||||
return NOERROR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
/* Select the new folder in the Look In combo box of the Open file dialog */
|
||||||
FILEDLG95_LOOKIN_SelectItem(fodInfos->DlgInfos.hwndLookInCB,fodInfos->ShellInfos.pidlAbsCurrent);
|
FILEDLG95_LOOKIN_SelectItem(fodInfos->DlgInfos.hwndLookInCB,fodInfos->ShellInfos.pidlAbsCurrent);
|
||||||
|
|
||||||
|
/* changes the tab order of the ListView to reflect the window's File Dialog */
|
||||||
|
hDlgWnd = GetDlgItem(GetParent(hwndView), IDC_LOOKIN);
|
||||||
|
SetWindowPos(hwndView, hDlgWnd, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE);
|
||||||
|
|
||||||
|
/* Since we destroyed the old view if it had focus set focus to the newly created view */
|
||||||
|
if (bViewHasFocus)
|
||||||
|
SetFocus(fodInfos->ShellInfos.hwndView);
|
||||||
|
|
||||||
return hRes;
|
return hRes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -693,7 +659,7 @@ HRESULT WINAPI IShellBrowserImpl_ICommDlgBrowser_OnStateChange(ICommDlgBrowser *
|
||||||
|
|
||||||
_ICOM_THIS_FromICommDlgBrowser(IShellBrowserImpl,iface);
|
_ICOM_THIS_FromICommDlgBrowser(IShellBrowserImpl,iface);
|
||||||
|
|
||||||
TRACE("(%p)\n", This);
|
TRACE("(%p shv=%p)\n", This, ppshv);
|
||||||
|
|
||||||
switch (uChange)
|
switch (uChange)
|
||||||
{
|
{
|
||||||
|
@ -809,7 +775,7 @@ HRESULT IShellBrowserImpl_ICommDlgBrowser_OnSelChange(ICommDlgBrowser *iface, IS
|
||||||
_ICOM_THIS_FromICommDlgBrowser(IShellBrowserImpl,iface);
|
_ICOM_THIS_FromICommDlgBrowser(IShellBrowserImpl,iface);
|
||||||
|
|
||||||
fodInfos = (FileOpenDlgInfos *) GetPropA(This->hwndOwner,FileOpenDlgInfosStr);
|
fodInfos = (FileOpenDlgInfos *) GetPropA(This->hwndOwner,FileOpenDlgInfosStr);
|
||||||
TRACE("(%p)\n", This);
|
TRACE("(%p do=%p view=%p)\n", This, fodInfos->Shell.FOIDataObject, fodInfos->Shell.FOIShellView);
|
||||||
|
|
||||||
/* release old selections */
|
/* release old selections */
|
||||||
if (fodInfos->Shell.FOIDataObject)
|
if (fodInfos->Shell.FOIDataObject)
|
||||||
|
@ -822,12 +788,6 @@ HRESULT IShellBrowserImpl_ICommDlgBrowser_OnSelChange(ICommDlgBrowser *iface, IS
|
||||||
|
|
||||||
FILEDLG95_FILENAME_FillFromSelection(This->hwndOwner);
|
FILEDLG95_FILENAME_FillFromSelection(This->hwndOwner);
|
||||||
|
|
||||||
if(fodInfos->DlgInfos.dwDlgProp & FODPROP_SAVEDLG)
|
|
||||||
SetDlgItemTextA(fodInfos->ShellInfos.hwndOwner,IDOK,"&Save");
|
|
||||||
else
|
|
||||||
SetDlgItemTextA(fodInfos->ShellInfos.hwndOwner,IDOK,"&Open");
|
|
||||||
|
|
||||||
/* fodInfos->DlgInfos.dwDlgProp |= FODPROP_USEVIEW; */
|
|
||||||
SendCustomDlgNotificationMessage(This->hwndOwner, CDN_SELCHANGE);
|
SendCustomDlgNotificationMessage(This->hwndOwner, CDN_SELCHANGE);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue