243 lines
6.8 KiB
C++
243 lines
6.8 KiB
C++
#include "fvcommands.h"
|
|
#include "utils.h"
|
|
#include <new> // std::nothrow
|
|
|
|
extern HINSTANCE g_hInst;
|
|
|
|
// Sub Commands for Settings
|
|
const FVCOMMANDITEM CFolderViewCommandProvider::c_FVTaskSettings[] =
|
|
{
|
|
// Icon reference should be replaced by absolute reference to own icon resource.
|
|
{&GUID_Setting1, IDS_SETTING1, IDS_SETTING1_TT, L"shell32.dll,-16710", 0, CFolderViewCommandProvider::s_OnSetting1, NULL, 0},
|
|
{&GUID_Setting2, IDS_SETTING2, IDS_SETTING2_TT, L"shell32.dll,-16710", 0, CFolderViewCommandProvider::s_OnSetting2, NULL, 0},
|
|
{&GUID_Setting3, IDS_SETTING3, IDS_SETTING3_TT, L"shell32.dll,-16710", 0, CFolderViewCommandProvider::s_OnSetting3, NULL, 0}
|
|
};
|
|
|
|
// Top-level commands
|
|
const FVCOMMANDITEM CFolderViewCommandProvider::c_FVTasks[] =
|
|
{
|
|
// Icon reference should be replaced by absolute reference to own icon resource.
|
|
{&GUID_Display, IDS_DISPLAY, IDS_DISPLAY_TT, L"shell32.dll,-42", 0, CFolderViewCommandProvider::s_OnDisplay, NULL, 0 },
|
|
{&GUID_Settings, IDS_SETTINGS, IDS_SETTINGS_TT, L"shell32.dll,-16710", ECF_HASSUBCOMMANDS, NULL, c_FVTaskSettings, ARRAYSIZE(c_FVTaskSettings)}
|
|
};
|
|
|
|
IFACEMETHODIMP CFolderViewCommandProvider::GetCommands(IUnknown * /* punkSite */, REFIID riid, void **ppv)
|
|
{
|
|
*ppv = NULL;
|
|
CFolderViewCommandEnumerator *pFVCommandEnum = new (std::nothrow) CFolderViewCommandEnumerator(c_FVTasks, ARRAYSIZE(c_FVTasks));
|
|
HRESULT hr = pFVCommandEnum ? S_OK : E_OUTOFMEMORY;
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = pFVCommandEnum->QueryInterface(riid, ppv);
|
|
pFVCommandEnum->Release();
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CFolderViewCommandProvider::s_OnDisplay(IShellItemArray *psiItemArray, IUnknown * /* pv */)
|
|
{
|
|
return DisplayItem(psiItemArray, NULL);
|
|
}
|
|
|
|
HRESULT CFolderViewCommandProvider::s_OnSetting1(IShellItemArray * /* psiItemArray */, IUnknown * /* pv */)
|
|
{
|
|
WCHAR sz[100];
|
|
HRESULT hr = LoadString(g_hInst, IDS_SETTING1, sz, ARRAYSIZE(sz)) ? S_OK : E_FAIL;
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
MessageBox(NULL, sz, sz, MB_OK);
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CFolderViewCommandProvider::s_OnSetting2(IShellItemArray * /* psiItemArray */, IUnknown * /* pv */)
|
|
{
|
|
WCHAR sz[100];
|
|
HRESULT hr = LoadString(g_hInst, IDS_SETTING2, sz, ARRAYSIZE(sz)) ? S_OK : E_FAIL;
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
MessageBox(NULL, sz, sz, MB_OK);
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CFolderViewCommandProvider::s_OnSetting3(IShellItemArray * /* psiItemArray */, IUnknown * /* pv */)
|
|
{
|
|
WCHAR sz[100];
|
|
HRESULT hr = LoadString(g_hInst, IDS_SETTING3, sz, ARRAYSIZE(sz)) ? S_OK : E_FAIL;
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
MessageBox(NULL, sz, sz, MB_OK);
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CFolderViewCommandEnumerator::_CreateCommandFromCommandItem(FVCOMMANDITEM *pfvci, IExplorerCommand **ppExplorerCommand)
|
|
{
|
|
CFolderViewCommand *pCommand = new (std::nothrow) CFolderViewCommand(pfvci);
|
|
HRESULT hr = pCommand ? S_OK : E_OUTOFMEMORY;
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = pCommand->QueryInterface(IID_PPV_ARGS(ppExplorerCommand));
|
|
pCommand->Release();
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
IFACEMETHODIMP CFolderViewCommandEnumerator::Next(ULONG celt, IExplorerCommand** apUICommand, ULONG *pceltFetched)
|
|
{
|
|
HRESULT hr = S_FALSE;
|
|
if (_uCurrent <= _uCommands)
|
|
{
|
|
UINT uIndex = 0;
|
|
HRESULT hrLocal = S_OK;
|
|
while (uIndex < celt && _uCurrent < _uCommands && SUCCEEDED(hrLocal))
|
|
{
|
|
hrLocal = _CreateCommandFromCommandItem((FVCOMMANDITEM*)&(_apfvci[_uCurrent]), &(apUICommand[uIndex]));
|
|
uIndex++;
|
|
_uCurrent++;
|
|
}
|
|
|
|
if (pceltFetched != NULL)
|
|
{
|
|
*pceltFetched = uIndex;
|
|
}
|
|
|
|
if (uIndex == celt)
|
|
{
|
|
hr = S_OK;
|
|
}
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
IFACEMETHODIMP CFolderViewCommandEnumerator::Skip(ULONG celt)
|
|
{
|
|
_uCurrent += celt;
|
|
|
|
HRESULT hr = S_OK;
|
|
if (_uCurrent > _uCommands)
|
|
{
|
|
_uCurrent = _uCommands;
|
|
hr = S_FALSE;
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
IFACEMETHODIMP CFolderViewCommandEnumerator::Reset()
|
|
{
|
|
_uCurrent = 0;
|
|
return S_OK;
|
|
}
|
|
|
|
IFACEMETHODIMP CFolderViewCommand::GetTitle(IShellItemArray * /* psiItemArray */, LPWSTR *ppszName)
|
|
{
|
|
*ppszName = NULL;
|
|
HRESULT hr = E_FAIL;
|
|
if (_pfvci)
|
|
{
|
|
WCHAR sz[100];
|
|
hr = LoadString(g_hInst, _pfvci->dwTitleID, sz, ARRAYSIZE(sz)) ? S_OK : E_FAIL;
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = SHStrDup(sz, ppszName);
|
|
}
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
IFACEMETHODIMP CFolderViewCommand::GetToolTip(IShellItemArray * /* psiItemArray */, LPWSTR *ppszInfotip)
|
|
{
|
|
*ppszInfotip = NULL;
|
|
HRESULT hr = E_FAIL;
|
|
if (_pfvci)
|
|
{
|
|
WCHAR sz[100];
|
|
hr = LoadString(g_hInst, _pfvci->dwToolTipID, sz, ARRAYSIZE(sz)) ? S_OK : E_FAIL;
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = SHStrDup(sz, ppszInfotip);
|
|
}
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
IFACEMETHODIMP CFolderViewCommand::GetIcon(IShellItemArray * /* psiItemArray */, LPWSTR *ppszIcon)
|
|
{
|
|
*ppszIcon = NULL;
|
|
HRESULT hr = E_FAIL;
|
|
if (_pfvci)
|
|
{
|
|
hr = SHStrDup(_pfvci->pszIcon, ppszIcon);
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
IFACEMETHODIMP CFolderViewCommand::GetState(IShellItemArray *psiItemArray, BOOL /* fOkToBeSlow */, EXPCMDSTATE *pCmdState)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
*pCmdState = ECS_DISABLED;
|
|
if (_pfvci)
|
|
{
|
|
if (*(_pfvci->pguidCanonicalName) == GUID_Display)
|
|
{
|
|
if (psiItemArray)
|
|
{
|
|
DWORD dwNumItems;
|
|
hr = psiItemArray->GetCount(&dwNumItems);
|
|
if ((SUCCEEDED(hr)) && (dwNumItems > 0))
|
|
{
|
|
*pCmdState = ECS_ENABLED;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
*pCmdState = ECS_ENABLED;
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
IFACEMETHODIMP CFolderViewCommand::GetFlags(EXPCMDFLAGS *pFlags)
|
|
{
|
|
if (_pfvci)
|
|
{
|
|
*pFlags = _pfvci->ecFlags;
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
IFACEMETHODIMP CFolderViewCommand::GetCanonicalName(GUID *pguidCommandName)
|
|
{
|
|
if (_pfvci)
|
|
{
|
|
*pguidCommandName = *(_pfvci->pguidCanonicalName);
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
IFACEMETHODIMP CFolderViewCommand::Invoke(IShellItemArray *psiItemArray, IBindCtx *pbc)
|
|
{
|
|
HRESULT hr = S_OK; // If no function defined - just return S_OK
|
|
if (_pfvci && _pfvci->pfnInvoke)
|
|
{
|
|
hr = _pfvci->pfnInvoke(psiItemArray, pbc);
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
IFACEMETHODIMP CFolderViewCommand::EnumSubCommands(IEnumExplorerCommand **ppEnum)
|
|
{
|
|
CFolderViewCommandEnumerator *pFVCommandEnum = new (std::nothrow) CFolderViewCommandEnumerator(_pfvci->pFVCIChildren, _pfvci->uChildCommands);
|
|
HRESULT hr = pFVCommandEnum ? S_OK : E_OUTOFMEMORY;
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = pFVCommandEnum->QueryInterface(IID_PPV_ARGS(ppEnum));
|
|
pFVCommandEnum->Release();
|
|
}
|
|
return hr;
|
|
}
|