Windows2000/private/windows/shell/lmui/shareui/menu.cxx
2020-09-30 17:12:32 +02:00

241 lines
5.3 KiB
C++

// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1995 - 1995.
// File: menu.cxx
// Contents: Implementation of IContextMenu
// History: 20-Dec-95 BruceFo Created
#include "headers.hxx"
#pragma hdrstop
#include "util.hxx"
#include "dutil.hxx"
#include "menu.hxx"
#include "menuutil.hxx"
#include "shares.h"
#include "resource.h"
CSharesCM::CSharesCM(
IN HWND hwnd
)
:
m_ulRefs(0),
m_hwnd(hwnd),
m_cidl(0),
m_apidl(NULL),
m_psf(NULL)
{
AddRef();
}
HRESULT
CSharesCM::InitInstance(
IN PWSTR pszMachine,
IN UINT cidl,
IN LPCITEMIDLIST* apidl,
IN IShellFolder* psf
)
{
m_pszMachine = pszMachine;
m_cidl = cidl;
m_apidl = ILA_Clone(cidl, apidl);
if (NULL == m_apidl)
{
return E_OUTOFMEMORY;
}
appAssert(NULL != psf);
m_psf = psf;
m_psf->AddRef();
return S_OK;
}
CSharesCM::~CSharesCM()
{
ILA_Free(m_cidl, m_apidl);
m_cidl = 0;
m_apidl = NULL;
appAssert(NULL != m_psf);
m_psf->Release();
m_psf = NULL;
}
STDMETHODIMP
CSharesCM::QueryContextMenu(
HMENU hmenu,
UINT indexMenu,
UINT idCmdFirst,
UINT idCmdLast,
UINT uFlags
)
{
if (uFlags & CMF_DVFILE)
{
// This IContextMenu was created to add items to the DefView "File"
// menu. This menu already has 4 standard items: Create Shortcut,
// Delete, Rename, and Properties. Since we only want Delete and
// Properties, and don't need to add anything, we simply do nothing
// and let DefView do the work.
return ResultFromShort(0);
}
else
{
// Got an IContextMenu because of a double-click on the item (to get
// the default item) or a right-click on the item (to display the
// entire context menu). So, put it up.
QCMINFO qcm = { hmenu, indexMenu, idCmdFirst, idCmdLast };
MyMergeMenu(g_hInstance, POPUP_SHARE, 0, &qcm);
ULONG dwInOut = SFGAO_CANDELETE | SFGAO_HASPROPSHEET | SFGAO_CANRENAME;
HRESULT hr = m_psf->GetAttributesOf(m_cidl, (LPCITEMIDLIST*)m_apidl, &dwInOut);
CHECK_HRESULT(hr);
if (FAILED(hr))
{
return hr;
}
if (!(dwInOut & SFGAO_CANDELETE))
{
EnableMenuItem(hmenu, idCmdFirst + SHARED_FILE_DELETE, MF_GRAYED | MF_BYCOMMAND);
}
if (!(dwInOut & SFGAO_CANRENAME))
{
EnableMenuItem(hmenu, idCmdFirst + SHARED_FILE_RENAME, MF_GRAYED | MF_BYCOMMAND);
}
if (!(dwInOut & SFGAO_HASPROPSHEET))
{
EnableMenuItem(hmenu, idCmdFirst + SHARED_FILE_PROPERTIES, MF_GRAYED | MF_BYCOMMAND);
}
SetMenuDefaultItem(hmenu, idCmdFirst + SHARED_FILE_PROPERTIES, FALSE);
return ResultFromShort(qcm.idCmdFirst - idCmdFirst);
}
}
STDMETHODIMP
CSharesCM::InvokeCommand(
LPCMINVOKECOMMANDINFO lpici
)
{
HRESULT hr = S_OK;
LPIDSHARE pids;
UINT i;
UINT idCmd = (UINT)LOWORD(lpici->lpVerb);
if (HIWORD(lpici->lpVerb))
{
// Deal with string commands
PSTR pszCmd = (PSTR)lpici->lpVerb;
// Check for "delete" and "properties" that come from the toolbar or
// the shell view.
if (0 == lstrcmpA(pszCmd, "delete"))
{
idCmd = SHARED_FILE_DELETE;
}
else if (0 == lstrcmpA(pszCmd, "rename"))
{
idCmd = SHARED_FILE_RENAME;
}
else if (0 == lstrcmpA(pszCmd, "properties"))
{
idCmd = SHARED_FILE_PROPERTIES;
}
else
{
return E_INVALIDARG;
}
}
switch(idCmd)
{
case SHARED_FILE_DELETE:
{
for (UINT i = 0; i < m_cidl; i++)
{
pids = (LPIDSHARE)m_apidl[i];
hr = ShareDoDelete(m_hwnd, m_pszMachine, Share_GetName(pids));
CHECK_HRESULT(hr);
// even if failure, keep going
}
break;
}
case SHARED_FILE_RENAME:
{
appAssert(!"Shouldn't get rename command here!");
hr = E_FAIL;
break;
}
case SHARED_FILE_PROPERTIES:
{
// should we do multiple-select properties?
appAssert(m_cidl == 1);
pids = (LPIDSHARE)m_apidl[0];
// pass in a pointer to our own IUnknown
IUnknown* punk;
hr = QueryInterface(IID_IUnknown, (LPVOID*)&punk);
if (SUCCEEDED(hr))
{
hr = ShareDoProperties(punk, m_pszMachine, Share_GetName(pids));
punk->Release();
}
break;
}
} // switch(wParam)
return hr;
}
STDMETHODIMP
CSharesCM::GetCommandString(
UINT_PTR idCmd,
UINT uType,
UINT * pwReserved,
LPSTR pszName,
UINT cchMax
)
{
HRESULT hr = E_FAIL;
*((LPWSTR)pszName) = TEXT('\0');
if (uType == GCS_HELPTEXT)
{
LoadStringW(g_hInstance, (UINT)(idCmd + IDS_MH_FSIDM_FIRST), (LPWSTR)pszName, cchMax);
hr = S_OK;
}
else if (uType == GCS_VERB)
{
switch(idCmd)
{
case SHARED_FILE_DELETE:
case SHARED_FILE_PROPERTIES:
break;
case SHARED_FILE_RENAME:
StrNCopy((LPWSTR)pszName, c_szRename, cchMax);
hr = S_OK;
break;
}
}
return hr;
}