////////////////// // Used for custom filtering. You must override to filter items. // HRESULT CFolderDialog::OnShouldShow( IShellFolder* psf, // This folder's IShellFolder LPCITEMIDLIST pidlFolder, // PIDL for folder containing item LPCITEMIDLIST pidlItem) // PIDL for item { BFTRACE(_T("CFolderDialog::OnShouldShow(%p): %s: %s\n"), psf, GetDisplayNameOf(psf,pidlFolder,SHGDN_NORMAL), GetDisplayNameOf(psf,pidlItem,SHGDN_NORMAL)); return S_OK; }
HRESULT WINAPI CNetFolder::GetDetailsOf(LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS *psd) { WCHAR buffer[MAX_PATH] = {0}; HRESULT hr = E_FAIL; if (iColumn >= NETWORKPLACESSHELLVIEWCOLUMNS) return E_FAIL; psd->fmt = NetworkPlacesSFHeader[iColumn].fmt; psd->cxChar = NetworkPlacesSFHeader[iColumn].cxChar; if (pidl == NULL) { psd->str.uType = STRRET_WSTR; if (LoadStringW(shell32_hInstance, NetworkPlacesSFHeader[iColumn].colnameid, buffer, _countof(buffer))) hr = SHStrDupW(buffer, &psd->str.pOleStr); return hr; } if (iColumn == COLUMN_NAME) return GetDisplayNameOf(pidl, SHGDN_NORMAL, &psd->str); FIXME("(%p)->(%p %i %p)\n", this, pidl, iColumn, psd); return E_NOTIMPL; }
HRESULT WINAPI CPrinterFolder::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) { WCHAR buffer[MAX_PATH] = {0}; HRESULT hr = E_FAIL; TRACE("(%p)->(%p %i %p): stub\n", this, pidl, iColumn, psd); if (iColumn >= PrinterSHELLVIEWCOLUMNS) return E_FAIL; psd->fmt = PrinterSFHeader[iColumn].fmt; psd->cxChar = PrinterSFHeader[iColumn].cxChar; if (pidl == NULL) { psd->str.uType = STRRET_WSTR; if (LoadStringW(shell32_hInstance, PrinterSFHeader[iColumn].colnameid, buffer, MAX_PATH)) hr = SHStrDupW(buffer, &psd->str.pOleStr); return hr; } if (iColumn == COLUMN_NAME) { psd->str.uType = STRRET_WSTR; return GetDisplayNameOf(pidl, SHGDN_NORMAL, &psd->str); } psd->str.uType = STRRET_CSTR; psd->str.cStr[0] = '\0'; return E_NOTIMPL; }
HRESULT WINAPI CControlPanelFolder::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) { HRESULT hr; TRACE("(%p)->(%p %i %p)\n", this, pidl, iColumn, psd); if (!psd || iColumn >= CONROLPANELSHELLVIEWCOLUMNS) return E_INVALIDARG; if (!pidl) { psd->fmt = ControlPanelSFHeader[iColumn].fmt; psd->cxChar = ControlPanelSFHeader[iColumn].cxChar; psd->str.uType = STRRET_CSTR; LoadStringA(shell32_hInstance, ControlPanelSFHeader[iColumn].colnameid, psd->str.cStr, MAX_PATH); return S_OK; } else { psd->str.cStr[0] = 0x00; psd->str.uType = STRRET_CSTR; switch(iColumn) { case 0: /* name */ hr = GetDisplayNameOf(pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &psd->str); break; case 1: /* comment */ _ILGetFileType(pidl, psd->str.cStr, MAX_PATH); break; } hr = S_OK; } return hr; }
HRESULT WINAPI CRegFolder::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) { if (!psd || iColumn >= 2) return E_INVALIDARG; GUID const *clsid = _ILGetGUIDPointer (pidl); if (!clsid) { ERR("Pidl is not reg item!\n"); return E_INVALIDARG; } switch(iColumn) { case 0: /* name */ return GetDisplayNameOf(pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &psd->str); case 1: /* comment */ HKEY hKey; if (HCR_RegOpenClassIDKey(*clsid, &hKey)) { psd->str.cStr[0] = 0x00; psd->str.uType = STRRET_CSTR; RegLoadMUIStringA(hKey, "InfoTip", psd->str.cStr, MAX_PATH, NULL, 0, NULL); RegCloseKey(hKey); return S_OK; } } return E_FAIL; }
HRESULT WINAPI CRecycleBin::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, LPSHELLDETAILS pDetails) { PIDLRecycleStruct * pFileDetails; WCHAR buffer[MAX_PATH]; WCHAR szTypeName[100]; LPWSTR pszBackslash; UINT Length; TRACE("(%p, %p, %d, %p)\n", this, pidl, iColumn, pDetails); if (iColumn >= COLUMNS_COUNT) return E_FAIL; pDetails->fmt = RecycleBinColumns[iColumn].fmt; pDetails->cxChar = RecycleBinColumns[iColumn].cxChars; if (pidl == NULL) return SHSetStrRet(&pDetails->str, RecycleBinColumns[iColumn].column_name_id); if (iColumn == COLUMN_NAME) return GetDisplayNameOf(pidl, SHGDN_NORMAL, &pDetails->str); pFileDetails = _ILGetRecycleStruct(pidl); switch (iColumn) { case COLUMN_DATEDEL: FormatDateTime(buffer, MAX_PATH, &pFileDetails->DeletionTime); break; case COLUMN_DELFROM: pszBackslash = wcsrchr(pFileDetails->szName, L'\\'); Length = (pszBackslash - pFileDetails->szName); memcpy((LPVOID)buffer, pFileDetails->szName, Length * sizeof(WCHAR)); buffer[Length] = L'\0'; break; case COLUMN_SIZE: StrFormatKBSizeW(pFileDetails->FileSize.QuadPart, buffer, MAX_PATH); break; case COLUMN_MTIME: FormatDateTime(buffer, MAX_PATH, &pFileDetails->LastModification); break; case COLUMN_TYPE: // FIXME: We should in fact use a UNICODE version of _ILGetFileType szTypeName[0] = L'\0'; wcscpy(buffer, PathFindExtensionW(pFileDetails->szName)); if (!( HCR_MapTypeToValueW(buffer, buffer, _countof(buffer), TRUE) && HCR_MapTypeToValueW(buffer, szTypeName, _countof(szTypeName), FALSE ))) { /* load localized file string */ szTypeName[0] = '\0'; if(LoadStringW(shell32_hInstance, IDS_ANY_FILE, szTypeName, _countof(szTypeName))) { szTypeName[63] = '\0'; StringCchPrintfW(buffer, _countof(buffer), szTypeName, PathFindExtensionW(pFileDetails->szName)); } } return SHSetStrRet(&pDetails->str, szTypeName); default: return E_FAIL; } return SHSetStrRet(&pDetails->str, buffer); }
/// <summary> /// Add's the icon with the specified ID to the view /// </summary> void TileGroup::AddIcon(PCITEMID_CHILD pidl) { // Don't add existing icons if (FindIcon(pidl) != nullptr) return; // Check if the icon should be supressed WCHAR buffer[MAX_PATH]; GetDisplayNameOf(pidl, SHGDN_FORPARSING, buffer, _countof(buffer)); if (mHiddenItems.find(buffer) != mHiddenItems.end()) return; LoadItemRequest request; request.folder = mWorkingFolder; request.targetIconWidth = mTileSettings.mIconSize; request.id = ILClone(pidl); nCore::LoadFolderItem(request, this); }
HRESULT WINAPI CNetFolder::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) { if (iColumn >= NETWORKPLACESSHELLVIEWCOLUMNS) return E_FAIL; psd->fmt = NetworkPlacesSFHeader[iColumn].fmt; psd->cxChar = NetworkPlacesSFHeader[iColumn].cxChar; if (pidl == NULL) return SHSetStrRet(&psd->str, NetworkPlacesSFHeader[iColumn].colnameid); if (iColumn == COLUMN_NAME) return GetDisplayNameOf(pidl, SHGDN_NORMAL, &psd->str); FIXME("(%p)->(%p %i %p)\n", this, pidl, iColumn, psd); return E_NOTIMPL; }
HRESULT WINAPI CAdminToolsFolder::GetDetailsOf(LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS *psd) { WCHAR buffer[MAX_PATH] = {0}; HRESULT hr = E_FAIL; TRACE("(%p)->(%p %i %p): stub\n", this, pidl, iColumn, psd); if (iColumn >= AdminToolsHELLVIEWCOLUMNS) return E_FAIL; psd->fmt = AdminToolsSFHeader[iColumn].fmt; psd->cxChar = AdminToolsSFHeader[iColumn].cxChar; if (pidl == NULL) { psd->str.uType = STRRET_WSTR; if (LoadStringW(shell32_hInstance, AdminToolsSFHeader[iColumn].colnameid, buffer, MAX_PATH)) hr = SHStrDupW(buffer, &psd->str.pOleStr); return hr; } psd->str.uType = STRRET_CSTR; switch (iColumn) { case COLUMN_NAME: psd->str.uType = STRRET_WSTR; hr = GetDisplayNameOf(pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &psd->str); break; case COLUMN_SIZE: _ILGetFileSize (pidl, psd->str.cStr, MAX_PATH); break; case COLUMN_TYPE: _ILGetFileType (pidl, psd->str.cStr, MAX_PATH); break; case COLUMN_DATE: _ILGetFileDate (pidl, psd->str.cStr, MAX_PATH); break; } return hr; }
HRESULT WINAPI CPrinterFolder::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) { TRACE("(%p)->(%p %i %p): stub\n", this, pidl, iColumn, psd); if (iColumn >= PrinterSHELLVIEWCOLUMNS) return E_FAIL; psd->fmt = PrinterSFHeader[iColumn].fmt; psd->cxChar = PrinterSFHeader[iColumn].cxChar; if (pidl == NULL) return SHSetStrRet(&psd->str, PrinterSFHeader[iColumn].colnameid); if (iColumn == COLUMN_NAME) return GetDisplayNameOf(pidl, SHGDN_NORMAL, &psd->str); psd->str.uType = STRRET_CSTR; psd->str.cStr[0] = '\0'; return E_NOTIMPL; }
HRESULT WINAPI CFontsFolder::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) { WCHAR buffer[MAX_PATH] = {0}; HRESULT hr = E_FAIL; PIDLFontStruct * pfont; HANDLE hFile; LARGE_INTEGER FileSize; SHFILEINFOW fi; TRACE("(%p, %p, %d, %p)\n", this, pidl, iColumn, psd); if (iColumn >= FontsSHELLVIEWCOLUMNS) return E_FAIL; psd->fmt = FontsSFHeader[iColumn].fmt; psd->cxChar = FontsSFHeader[iColumn].cxChar; if (pidl == NULL) { psd->str.uType = STRRET_WSTR; if (LoadStringW(shell32_hInstance, FontsSFHeader[iColumn].colnameid, buffer, MAX_PATH)) hr = SHStrDupW(buffer, &psd->str.pOleStr); return hr; } if (iColumn == COLUMN_NAME) { psd->str.uType = STRRET_WSTR; return GetDisplayNameOf(pidl, SHGDN_NORMAL, &psd->str); } psd->str.uType = STRRET_CSTR; psd->str.cStr[0] = '\0'; switch(iColumn) { case COLUMN_TYPE: pfont = _ILGetFontStruct(pidl); if (pfont) { if (SHGetFileInfoW(pfont->szName + pfont->offsFile, 0, &fi, sizeof(fi), SHGFI_TYPENAME)) { psd->str.pOleStr = (LPWSTR)CoTaskMemAlloc((wcslen(fi.szTypeName) + 1) * sizeof(WCHAR)); if (!psd->str.pOleStr) return E_OUTOFMEMORY; wcscpy(psd->str.pOleStr, fi.szTypeName); psd->str.uType = STRRET_WSTR; return S_OK; } } break; case COLUMN_SIZE: pfont = _ILGetFontStruct(pidl); if (pfont) { hFile = CreateFileW(pfont->szName + pfont->offsFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile != INVALID_HANDLE_VALUE) { if (GetFileSizeEx(hFile, &FileSize)) { if (StrFormatByteSizeW(FileSize.QuadPart, buffer, sizeof(buffer) / sizeof(WCHAR))) { psd->str.pOleStr = (LPWSTR)CoTaskMemAlloc(wcslen(buffer) + 1); if (!psd->str.pOleStr) { CloseHandle(hFile); return E_OUTOFMEMORY; } wcscpy(psd->str.pOleStr, buffer); psd->str.uType = STRRET_WSTR; CloseHandle(hFile); return S_OK; } } CloseHandle(hFile); } } break; case COLUMN_FILENAME: pfont = _ILGetFontStruct(pidl); if (pfont) { psd->str.pOleStr = (LPWSTR)CoTaskMemAlloc((wcslen(pfont->szName + pfont->offsFile) + 1) * sizeof(WCHAR)); if (psd->str.pOleStr) { psd->str.uType = STRRET_WSTR; wcscpy(psd->str.pOleStr, pfont->szName + pfont->offsFile); return S_OK; } else return E_OUTOFMEMORY; } break; } return E_FAIL; }
/************************************************************************** * ICPanel_IContextMenu_InvokeCommand() */ HRESULT WINAPI CControlPanelFolder::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi) { WCHAR szPath[MAX_PATH]; char szTarget[MAX_PATH]; STRRET strret; WCHAR* pszPath; INT Length, cLength; CComPtr<IPersistFile> ppf; CComPtr<IShellLinkA> isl; HRESULT hResult; PIDLCPanelStruct *pcpanel = _ILGetCPanelPointer(apidl[0]); TRACE("(%p)->(invcom=%p verb=%p wnd=%p)\n", this, lpcmi, lpcmi->lpVerb, lpcmi->hwnd); if (lpcmi->lpVerb == MAKEINTRESOURCEA(IDS_OPEN)) //FIXME { LPITEMIDLIST lpIDList = ILCombine(pidlRoot, apidl[0]); if (!pcpanel) { /* UGLY HACK! */ LPSHELLBROWSER lpSB = (LPSHELLBROWSER)SendMessageW(lpcmi->hwnd, CWM_GETISHELLBROWSER, 0, 0); HRESULT hr; if (lpSB == NULL) return E_FAIL; hr = lpSB->BrowseObject(lpIDList, 0); return hr; } /* Note: we pass the applet name to Control_RunDLL to distinguish between multiple applets in one .cpl file */ ShellExecuteA(NULL, "cplopen", pcpanel->szName, pcpanel->szName + pcpanel->offsDispName, NULL, 0); } else if (lpcmi->lpVerb == MAKEINTRESOURCEA(IDS_CREATELINK)) //FIXME { if (!SHGetSpecialFolderPathW(NULL, szPath, CSIDL_DESKTOPDIRECTORY, FALSE)) return E_FAIL; pszPath = PathAddBackslashW(szPath); if (!pszPath) return E_FAIL; if (GetDisplayNameOf(apidl[0], SHGDN_FORPARSING, &strret) != S_OK) return E_FAIL; Length = MAX_PATH - (pszPath - szPath); cLength = strlen(strret.cStr); if (Length < cLength + 5) { FIXME("\n"); return E_FAIL; } if (MultiByteToWideChar(CP_ACP, 0, strret.cStr, cLength + 1, pszPath, Length)) { pszPath += cLength; Length -= cLength; } if (Length > 10) { wcscpy(pszPath, L" - "); cLength = LoadStringW(shell32_hInstance, IDS_LNK_FILE, &pszPath[3], Length - 4) + 3; if (cLength + 5 > Length) cLength = Length - 5; Length -= cLength; pszPath += cLength; } wcscpy(pszPath, L".lnk"); pcpanel = _ILGetCPanelPointer(ILFindLastID(apidl[0])); if (pcpanel) { strncpy(szTarget, pcpanel->szName, MAX_PATH); } else { FIXME("Couldn't retrieve pointer to cpl structure\n"); return E_FAIL; } hResult = CShellLink::_CreatorClass::CreateInstance(NULL, IID_PPV_ARG(IShellLinkA, &isl)); if (SUCCEEDED(hResult)) { isl->SetPath(szTarget); if (SUCCEEDED(isl->QueryInterface(IID_PPV_ARG(IPersistFile,&ppf)))) ppf->Save(szPath, TRUE); } return NOERROR; } return S_OK; }
////////////////// // User selected a different folder. // void CFolderDialog::OnSelChanged(LPCITEMIDLIST pidl) { BFTRACE(_T("CFolderDialog::OnSelChanged: %s\n"), GetDisplayNameOf(m_shfRoot, pidl, SHGDN_FORPARSING)); }
HRESULT WINAPI CNetworkConnections::GetDetailsOf( PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS * psd) { WCHAR buffer[MAX_PATH] = {0}; HRESULT hr = E_FAIL; const VALUEStruct * val; NETCON_PROPERTIES * pProperties; if (iColumn >= NETCONNECTSHELLVIEWCOLUMNS) return E_FAIL; psd->fmt = NetConnectSFHeader[iColumn].fmt; psd->cxChar = NetConnectSFHeader[iColumn].cxChar; if (pidl == NULL) { psd->str.uType = STRRET_WSTR; if (LoadStringW(netshell_hInstance, NetConnectSFHeader[iColumn].colnameid, buffer, MAX_PATH)) hr = SHStrDupW(buffer, &psd->str.pOleStr); return hr; } if (iColumn == COLUMN_NAME) { psd->str.uType = STRRET_WSTR; return GetDisplayNameOf(pidl, SHGDN_NORMAL, &psd->str); } val = _ILGetValueStruct(pidl); if (!val) return E_FAIL; if (!val->pItem) return E_FAIL; if (val->pItem->GetProperties(&pProperties) != S_OK) return E_FAIL; switch (iColumn) { case COLUMN_TYPE: if (pProperties->MediaType == NCM_LAN || pProperties->MediaType == NCM_SHAREDACCESSHOST_RAS) { if (LoadStringW(netshell_hInstance, IDS_TYPE_ETHERNET, buffer, MAX_PATH)) { psd->str.uType = STRRET_WSTR; hr = SHStrDupW(buffer, &psd->str.pOleStr); } } break; case COLUMN_STATUS: buffer[0] = L'\0'; if (pProperties->Status == NCS_HARDWARE_DISABLED) LoadStringW(netshell_hInstance, IDS_STATUS_NON_OPERATIONAL, buffer, MAX_PATH); else if (pProperties->Status == NCS_DISCONNECTED) LoadStringW(netshell_hInstance, IDS_STATUS_UNREACHABLE, buffer, MAX_PATH); else if (pProperties->Status == NCS_MEDIA_DISCONNECTED) LoadStringW(netshell_hInstance, IDS_STATUS_DISCONNECTED, buffer, MAX_PATH); else if (pProperties->Status == NCS_CONNECTING) LoadStringW(netshell_hInstance, IDS_STATUS_CONNECTING, buffer, MAX_PATH); else if (pProperties->Status == NCS_CONNECTED) LoadStringW(netshell_hInstance, IDS_STATUS_CONNECTED, buffer, MAX_PATH); if (buffer[0]) { buffer[MAX_PATH-1] = L'\0'; psd->str.uType = STRRET_WSTR; hr = SHStrDupW(buffer, &psd->str.pOleStr); } break; case COLUMN_DEVNAME: if (pProperties->pszwDeviceName) { wcscpy(buffer, pProperties->pszwDeviceName); buffer[MAX_PATH-1] = L'\0'; psd->str.uType = STRRET_WSTR; hr = SHStrDupW(buffer, &psd->str.pOleStr); } else { psd->str.cStr[0] = '\0'; psd->str.uType = STRRET_CSTR; } break; case COLUMN_PHONE: case COLUMN_OWNER: psd->str.cStr[0] = '\0'; psd->str.uType = STRRET_CSTR; break; } NcFreeNetconProperties(pProperties); return hr; }