mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 17:34:57 +00:00
- implement IShellPropSheetExt handling for file property dialogs for standard file classes
- makes shellink property dialog appear again (and many others ;) ) svn path=/trunk/; revision=34341
This commit is contained in:
parent
32f75a3033
commit
37b079f715
1 changed files with 101 additions and 3 deletions
|
@ -53,6 +53,7 @@ typedef struct _LANGANDCODEPAGE_
|
||||||
WORD code;
|
WORD code;
|
||||||
} LANGANDCODEPAGE, *LPLANGANDCODEPAGE;
|
} LANGANDCODEPAGE, *LPLANGANDCODEPAGE;
|
||||||
|
|
||||||
|
HPSXA WINAPI SHCreatePropSheetExtArrayEx(HKEY hKey, LPCWSTR pszSubKey, UINT max_iface, IDataObject *pDataObj);
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
*
|
*
|
||||||
* SH_CreatePropertySheetPage [Internal]
|
* SH_CreatePropertySheetPage [Internal]
|
||||||
|
@ -647,6 +648,66 @@ SH_FileGeneralDlgProc(
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOL CALLBACK AddShellPropSheetExCallback(HPROPSHEETPAGE hPage, LPARAM lParam)
|
||||||
|
{
|
||||||
|
UINT iIndex;
|
||||||
|
HPROPSHEETPAGE * hppages = (HPROPSHEETPAGE *)lParam;
|
||||||
|
|
||||||
|
TRACE("AddShellPropSheetExCallback called\n");
|
||||||
|
for(iIndex = 0; iIndex < MAX_PROPERTY_SHEET_PAGE; iIndex++)
|
||||||
|
{
|
||||||
|
if (hppages[iIndex] == NULL)
|
||||||
|
{
|
||||||
|
hppages[iIndex] = hPage;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
EnumPropSheetExt(LPWSTR wFileName, HPROPSHEETPAGE * hppages, int NumPages, HPSXA * hpsxa, IDataObject *pDataObj)
|
||||||
|
{
|
||||||
|
WCHAR szName[100];
|
||||||
|
WCHAR * pOffset;
|
||||||
|
UINT Length;
|
||||||
|
DWORD dwName;
|
||||||
|
int Pages;
|
||||||
|
|
||||||
|
pOffset = wcsrchr(wFileName, L'.');
|
||||||
|
if (!pOffset)
|
||||||
|
{
|
||||||
|
wcscpy(szName, L"CLSID\\");
|
||||||
|
wcscpy(&szName[6], wFileName);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Length = wcslen(pOffset);
|
||||||
|
if (Length >= 70)
|
||||||
|
return 0;
|
||||||
|
wcscpy(szName, pOffset);
|
||||||
|
}
|
||||||
|
TRACE("EnumPropSheetExt szName %s\n", debugstr_w(szName));
|
||||||
|
hpsxa[0] = SHCreatePropSheetExtArrayEx(HKEY_CLASSES_ROOT, szName, NumPages, pDataObj);
|
||||||
|
Pages = SHAddFromPropSheetExtArray(hpsxa[0], AddShellPropSheetExCallback, (LPARAM)hppages);
|
||||||
|
|
||||||
|
|
||||||
|
if (pOffset)
|
||||||
|
{
|
||||||
|
/* try to load property sheet handlers from prog id key */
|
||||||
|
dwName = sizeof(szName);
|
||||||
|
if (RegGetValueW(HKEY_CLASSES_ROOT, pOffset, NULL, RRF_RT_REG_SZ, NULL, szName, &dwName) == ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
TRACE("EnumPropSheetExt szName %s, pOffset %s\n", debugstr_w(szName), debugstr_w(pOffset));
|
||||||
|
hpsxa[1] = SHCreatePropSheetExtArrayEx(HKEY_CLASSES_ROOT, szName, NumPages - Pages, pDataObj);
|
||||||
|
Pages +=SHAddFromPropSheetExtArray(hpsxa[1], AddShellPropSheetExCallback, (LPARAM)hppages);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Pages;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
*
|
*
|
||||||
|
@ -670,6 +731,12 @@ SH_ShowPropertiesDialog(PCWSTR lpf)
|
||||||
UINT num_pages = 0;
|
UINT num_pages = 0;
|
||||||
DWORD dwHandle = 0;
|
DWORD dwHandle = 0;
|
||||||
WCHAR * pFileName;
|
WCHAR * pFileName;
|
||||||
|
HPSXA hpsxa[2];
|
||||||
|
INT_PTR res;
|
||||||
|
LPITEMIDLIST pidlChild, pidlFolder;
|
||||||
|
WCHAR szTemp[MAX_PATH];
|
||||||
|
IDataObject* pDataObj = NULL;
|
||||||
|
HRESULT hResult;
|
||||||
|
|
||||||
TRACE("SH_ShowPropertiesDialog entered filename %s\n", debugstr_w(lpf));
|
TRACE("SH_ShowPropertiesDialog entered filename %s\n", debugstr_w(lpf));
|
||||||
|
|
||||||
|
@ -701,6 +768,26 @@ SH_ShowPropertiesDialog(PCWSTR lpf)
|
||||||
FIXME("directory / drive resources are missing\n");
|
FIXME("directory / drive resources are missing\n");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wcscpy(szTemp, wFileName);
|
||||||
|
pFileName = wcsrchr(szTemp, '\\');
|
||||||
|
if (pFileName)
|
||||||
|
{
|
||||||
|
pFileName[0] = L'\0';
|
||||||
|
pFileName++;
|
||||||
|
pidlChild = ILCreateFromPathW(pFileName);
|
||||||
|
pidlFolder = ILCreateFromPathW(szTemp);
|
||||||
|
if (pidlChild && pidlFolder)
|
||||||
|
{
|
||||||
|
hResult = SHCreateDataObject(pidlFolder, 1, (LPCITEMIDLIST*)&pidlChild, NULL, &IID_IDataObject, (LPVOID*)&pDataObj);
|
||||||
|
ILFree(pidlChild);
|
||||||
|
ILFree(pidlFolder);
|
||||||
|
if (hResult != S_OK)
|
||||||
|
pDataObj = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
hpage = SH_CreatePropertySheetPage("SHELL_FILE_GENERAL_DLG", SH_FileGeneralDlgProc, (LPARAM)wFileName, NULL);
|
hpage = SH_CreatePropertySheetPage("SHELL_FILE_GENERAL_DLG", SH_FileGeneralDlgProc, (LPARAM)wFileName, NULL);
|
||||||
|
|
||||||
if (hpage == NULL)
|
if (hpage == NULL)
|
||||||
|
@ -708,7 +795,9 @@ SH_ShowPropertiesDialog(PCWSTR lpf)
|
||||||
|
|
||||||
hppages[num_pages] = hpage;
|
hppages[num_pages] = hpage;
|
||||||
num_pages++;
|
num_pages++;
|
||||||
if ( GetFileVersionInfoSizeW(lpf, &dwHandle) )
|
num_pages += EnumPropSheetExt(wFileName, hppages, MAX_PROPERTY_SHEET_PAGE-1, hpsxa, pDataObj);
|
||||||
|
|
||||||
|
if ( GetFileVersionInfoSizeW(lpf, &dwHandle) && num_pages)
|
||||||
{
|
{
|
||||||
if ( (hpage = SH_CreatePropertySheetPage("SHELL_FILE_VERSION_DLG",SH_FileVersionDlgProc, (LPARAM)wFileName, NULL))!= NULL)
|
if ( (hpage = SH_CreatePropertySheetPage("SHELL_FILE_VERSION_DLG",SH_FileVersionDlgProc, (LPARAM)wFileName, NULL))!= NULL)
|
||||||
{
|
{
|
||||||
|
@ -730,6 +819,15 @@ SH_ShowPropertiesDialog(PCWSTR lpf)
|
||||||
pinfo.nPages = num_pages;
|
pinfo.nPages = num_pages;
|
||||||
pinfo.u3.phpage = hppages;
|
pinfo.u3.phpage = hppages;
|
||||||
pinfo.pszCaption = pFileName;
|
pinfo.pszCaption = pFileName;
|
||||||
return (PropertySheetW(&pinfo) != -1);
|
|
||||||
|
TRACE("SH_ShowPropertiesDialog pages %u\n", num_pages);
|
||||||
|
res = PropertySheetW(&pinfo);
|
||||||
|
|
||||||
|
SHDestroyPropSheetExtArray(hpsxa[0]);
|
||||||
|
SHDestroyPropSheetExtArray(hpsxa[1]);
|
||||||
|
if (pDataObj)
|
||||||
|
IDataObject_Release(pDataObj);
|
||||||
|
|
||||||
|
return (res != -1);
|
||||||
}
|
}
|
||||||
/*EOF */
|
/*EOF */
|
||||||
|
|
Loading…
Reference in a new issue