mirror of
https://github.com/reactos/reactos.git
synced 2026-06-01 17:00:51 +08:00
Improve usability of Fonts folder. JIRA issue: CORE-17311 - Modify PIDL design to contain name and filename. - Implement CFontExt:: ParseDisplayName to parsing name as PIDL. - Modify CDefaultContextMenu:: GetCommandString and CDefaultContextMenu:: DoCopyOrCut for DFM_GETVERBA, DFM_GETVERBW, DFM_CMD_COPY, and DFM_CMD_MOVE. - Add IDS_CONFIRM_DELETE_FONT, IDS_CANTDELETEFONT, and IDS_PROPERTIES resource strings. - Add SHMultiFileProperties prototype to <shlobj.h>.
114 lines
2.8 KiB
C++
114 lines
2.8 KiB
C++
/*
|
|
* PROJECT: ReactOS Font Shell Extension
|
|
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
|
|
* PURPOSE: CEnumFonts implementation
|
|
* COPYRIGHT: Copyright 2019 Mark Jansen <mark.jansen@reactos.org>
|
|
*/
|
|
|
|
#include "precomp.h"
|
|
|
|
WINE_DEFAULT_DEBUG_CHANNEL(fontext);
|
|
|
|
class CEnumFonts :
|
|
public CComObjectRootEx<CComMultiThreadModelNoCS>,
|
|
public IEnumIDList
|
|
{
|
|
private:
|
|
DWORD m_dwFlags;
|
|
ULONG m_Index;
|
|
|
|
public:
|
|
CEnumFonts()
|
|
: m_dwFlags(0)
|
|
, m_Index(0)
|
|
{
|
|
}
|
|
|
|
HRESULT Initialize(CFontExt* folder, DWORD flags)
|
|
{
|
|
m_dwFlags = flags;
|
|
m_Index = 0;
|
|
return S_OK;
|
|
}
|
|
|
|
// *** IEnumIDList methods ***
|
|
STDMETHODIMP Next(ULONG celt, LPITEMIDLIST *rgelt, ULONG *pceltFetched) override
|
|
{
|
|
if (!rgelt || (!pceltFetched && celt != 1))
|
|
return E_POINTER;
|
|
|
|
HRESULT hr = S_OK;
|
|
ULONG Fetched = 0;
|
|
|
|
while (celt)
|
|
{
|
|
if (m_Index >= g_FontCache->Size())
|
|
{
|
|
hr = S_FALSE;
|
|
break;
|
|
}
|
|
|
|
if (!g_FontCache->IsMarkDeleted(m_Index))
|
|
{
|
|
CStringW Name = g_FontCache->Name(m_Index), FileName = g_FontCache->File(m_Index);
|
|
if (Name.IsEmpty() || FileName.IsEmpty())
|
|
{
|
|
ERR("Why is Name or FileName empty?\n");
|
|
}
|
|
else
|
|
{
|
|
// Create a PIDL
|
|
PITEMID_CHILD item = _ILCreate(Name, FileName);
|
|
if (!item)
|
|
{
|
|
hr = Fetched ? S_FALSE : E_OUTOFMEMORY;
|
|
break;
|
|
}
|
|
rgelt[Fetched++] = item;
|
|
--celt;
|
|
}
|
|
}
|
|
m_Index++;
|
|
}
|
|
|
|
if (pceltFetched)
|
|
*pceltFetched = Fetched;
|
|
return hr;
|
|
}
|
|
|
|
STDMETHODIMP Skip(ULONG celt) override
|
|
{
|
|
for (ULONG i = 0; i < celt && m_Index < g_FontCache->Size(); ++i)
|
|
{
|
|
while (m_Index < g_FontCache->Size() && g_FontCache->IsMarkDeleted(m_Index))
|
|
++m_Index;
|
|
++m_Index;
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP Reset() override
|
|
{
|
|
m_Index = 0;
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP Clone(IEnumIDList **ppenum) override
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
public:
|
|
DECLARE_NOT_AGGREGATABLE(CEnumFonts)
|
|
DECLARE_PROTECT_FINAL_CONSTRUCT()
|
|
|
|
BEGIN_COM_MAP(CEnumFonts)
|
|
COM_INTERFACE_ENTRY_IID(IID_IEnumIDList, IEnumIDList)
|
|
END_COM_MAP()
|
|
};
|
|
|
|
HRESULT _CEnumFonts_CreateInstance(CFontExt* zip, DWORD flags, REFIID riid, LPVOID * ppvOut)
|
|
{
|
|
return ShellObjectCreatorInit<CEnumFonts>(zip, flags, riid, ppvOut);
|
|
}
|