[SHELL32] Fix detailed list views in Control Panel and Registry Folder

- Add enums for Control Panel and Registry Folder columns
- Fix iColumn values in GetDetailsOf() and fix checks in
  GetDefaultColumnState()

Current CControlPanelFolder::CompareIDs was using wrong lparam column
index. Actual column index should be 1 instead of 4. Because of this
the comment column next to name in details view was not being displayed
correctly. The same fixes for CRegFolder class functions.

PR #4944. CORE-18743 CORE-18501
This commit is contained in:
Muthu R Kumar 2022-12-20 07:42:07 -08:00 committed by GitHub
parent 28088ab25d
commit 4c25af5bd4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 27 additions and 13 deletions

View file

@ -52,7 +52,12 @@ static const shvheader ControlPanelSFHeader[] = {
{IDS_SHV_COLUMN_COMMENTS, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 80},/*FIXME*/ {IDS_SHV_COLUMN_COMMENTS, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 80},/*FIXME*/
}; };
#define CONROLPANELSHELLVIEWCOLUMNS 2 enum controlpanel_columns
{
CONTROLPANEL_COL_NAME,
CONTROLPANEL_COL_COMMENT,
CONTROLPANEL_COL_COUNT,
};
CControlPanelEnum::CControlPanelEnum() CControlPanelEnum::CControlPanelEnum()
{ {
@ -324,16 +329,16 @@ HRESULT WINAPI CControlPanelFolder::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE
PIDLCPanelStruct *pData1 = _ILGetCPanelPointer(pidl1); PIDLCPanelStruct *pData1 = _ILGetCPanelPointer(pidl1);
PIDLCPanelStruct *pData2 = _ILGetCPanelPointer(pidl2); PIDLCPanelStruct *pData2 = _ILGetCPanelPointer(pidl2);
if (!pData1 || !pData2 || LOWORD(lParam)>= CONROLPANELSHELLVIEWCOLUMNS) if (!pData1 || !pData2 || LOWORD(lParam) >= CONTROLPANEL_COL_COUNT)
return E_INVALIDARG; return E_INVALIDARG;
int result; int result;
switch(LOWORD(lParam)) switch(LOWORD(lParam))
{ {
case 0: /* name */ case CONTROLPANEL_COL_NAME:
result = wcsicmp(pData1->szName + pData1->offsDispName, pData2->szName + pData2->offsDispName); result = wcsicmp(pData1->szName + pData1->offsDispName, pData2->szName + pData2->offsDispName);
break; break;
case 4: /* comment */ case CONTROLPANEL_COL_COMMENT:
result = wcsicmp(pData1->szName + pData1->offsComment, pData2->szName + pData2->offsComment); result = wcsicmp(pData1->szName + pData1->offsComment, pData2->szName + pData2->offsComment);
break; break;
default: default:
@ -544,7 +549,8 @@ HRESULT WINAPI CControlPanelFolder::GetDefaultColumnState(UINT iColumn, DWORD *p
{ {
TRACE("(%p)\n", this); TRACE("(%p)\n", this);
if (!pcsFlags || iColumn >= CONROLPANELSHELLVIEWCOLUMNS) return E_INVALIDARG; if (!pcsFlags || iColumn >= CONTROLPANEL_COL_COUNT)
return E_INVALIDARG;
*pcsFlags = ControlPanelSFHeader[iColumn].pcsFlags; *pcsFlags = ControlPanelSFHeader[iColumn].pcsFlags;
return S_OK; return S_OK;
} }
@ -557,7 +563,7 @@ HRESULT WINAPI CControlPanelFolder::GetDetailsEx(PCUITEMID_CHILD pidl, const SHC
HRESULT WINAPI CControlPanelFolder::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) HRESULT WINAPI CControlPanelFolder::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd)
{ {
if (!psd || iColumn >= CONROLPANELSHELLVIEWCOLUMNS) if (!psd || iColumn >= CONTROLPANEL_COL_COUNT)
return E_INVALIDARG; return E_INVALIDARG;
if (!pidl) if (!pidl)
@ -579,14 +585,14 @@ HRESULT WINAPI CControlPanelFolder::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iCol
switch(iColumn) switch(iColumn)
{ {
case 0: /* name */ case CONTROLPANEL_COL_NAME:
return SHSetStrRet(&psd->str, pCPanel->szName + pCPanel->offsDispName); return SHSetStrRet(&psd->str, pCPanel->szName + pCPanel->offsDispName);
case 4: /* comment */ case CONTROLPANEL_COL_COMMENT:
return SHSetStrRet(&psd->str, pCPanel->szName + pCPanel->offsComment); return SHSetStrRet(&psd->str, pCPanel->szName + pCPanel->offsComment);
} }
} }
return S_OK; return E_FAIL;
} }
HRESULT WINAPI CControlPanelFolder::MapColumnToSCID(UINT column, SHCOLUMNID *pscid) HRESULT WINAPI CControlPanelFolder::MapColumnToSCID(UINT column, SHCOLUMNID *pscid)

View file

@ -212,6 +212,14 @@ class CRegFolderEnum :
END_COM_MAP() END_COM_MAP()
}; };
enum registry_columns
{
REGISTRY_COL_NAME,
REGISTRY_COL_TYPE,
REGISTRY_COL_VALUE,
REGISTRY_COL_COUNT,
};
CRegFolderEnum::CRegFolderEnum() CRegFolderEnum::CRegFolderEnum()
{ {
} }
@ -723,7 +731,7 @@ HRESULT WINAPI CRegFolder::GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pD
HRESULT WINAPI CRegFolder::GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags) HRESULT WINAPI CRegFolder::GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags)
{ {
if (iColumn >= 2) if (iColumn >= REGISTRY_COL_COUNT)
return E_INVALIDARG; return E_INVALIDARG;
*pcsFlags = SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT; *pcsFlags = SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT;
return S_OK; return S_OK;
@ -749,11 +757,11 @@ HRESULT WINAPI CRegFolder::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHEL
switch(iColumn) switch(iColumn)
{ {
case 0: /* name */ case REGISTRY_COL_NAME:
return GetDisplayNameOf(pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &psd->str); return GetDisplayNameOf(pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &psd->str);
case 1: /* type */ case REGISTRY_COL_TYPE:
return SHSetStrRet(&psd->str, IDS_SYSTEMFOLDER); return SHSetStrRet(&psd->str, IDS_SYSTEMFOLDER);
case 4: /* comments */ case REGISTRY_COL_VALUE:
HKEY hKey; HKEY hKey;
if (!HCR_RegOpenClassIDKey(*clsid, &hKey)) if (!HCR_RegOpenClassIDKey(*clsid, &hKey))
return SHSetStrRet(&psd->str, ""); return SHSetStrRet(&psd->str, "");