230 lines
5.7 KiB
C++
230 lines
5.7 KiB
C++
//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
|
|
//
|
|
// view.cpp
|
|
//
|
|
// IShellView helper functions. Cdf view uses the default IShellView and
|
|
// relies on a callback to supply specific information.
|
|
//
|
|
// History:
|
|
//
|
|
// 3/20/97 edwardp Created.
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
// Includes
|
|
//
|
|
|
|
#include "stdinc.h"
|
|
#include "view.h"
|
|
#include "cdfidl.h"
|
|
#include "resource.h"
|
|
|
|
#include <mluisupp.h>
|
|
|
|
#include <shellp.h> // SHCreateShellFolderViewEx
|
|
|
|
|
|
//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
|
|
//
|
|
// *** CreateDefaultShellView ***
|
|
//
|
|
//
|
|
// Description:
|
|
// Creates a shell implemented default IShellView object for the given
|
|
// folder.
|
|
//
|
|
// Parameters:
|
|
// [In] pIShellFolder - The folder for which the default IShellView is
|
|
// created.
|
|
// [In] pidl - The id list for the given folder.
|
|
// [Out] ppIShellView - A pointer to receive the IShellView interface.
|
|
//
|
|
// Return:
|
|
// The result from the private shell function SHCreateShellFolderViewEx.
|
|
//
|
|
// Comments:
|
|
// The default IShellView object communicates with its associated folder
|
|
// via a callback function.
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT
|
|
CreateDefaultShellView(
|
|
IShellFolder *pIShellFolder,
|
|
LPITEMIDLIST pidl,
|
|
IShellView** ppIShellView
|
|
)
|
|
{
|
|
ASSERT(pIShellFolder);
|
|
ASSERT(ppIShellView);
|
|
|
|
CSFV csfv;
|
|
|
|
csfv.cbSize = sizeof(CSFV);
|
|
csfv.pshf = pIShellFolder;
|
|
csfv.psvOuter = NULL;
|
|
csfv.pidl = pidl;
|
|
csfv.lEvents = 0; //SHCNE_DELETE | SHCNE_CREATE;
|
|
csfv.pfnCallback = IShellViewCallback;
|
|
csfv.fvm = (FOLDERVIEWMODE)0; // FVM_ICON, FVM_DETAILS, etc.
|
|
|
|
return SHCreateShellFolderViewEx(&csfv, ppIShellView);
|
|
}
|
|
|
|
//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
|
|
//
|
|
// *** IShellViewCallback ***
|
|
//
|
|
//
|
|
// Description:
|
|
// The callback function used by the default ISHellView to request
|
|
// inforamtion.
|
|
//
|
|
// Parameters:
|
|
// [In] pIShellViewOuter - Always NULL.
|
|
// [In] pIShellFolder - The folder associated with this view.
|
|
// [In] hwnd - The hwnd of the shell view.
|
|
// [In] msg - The callback message.
|
|
// [InOut] wParam - Message specific parameter.
|
|
// [InOut] lParam - Message specific parameter.
|
|
//
|
|
// Return:
|
|
//
|
|
//
|
|
// Comments:
|
|
//
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT
|
|
CALLBACK IShellViewCallback(
|
|
IShellView* pIShellViewOuter,
|
|
IShellFolder* pIShellFolder,
|
|
HWND hwnd,
|
|
UINT msg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
HRESULT hr;
|
|
|
|
switch (msg)
|
|
{
|
|
case DVM_GETDETAILSOF:
|
|
hr = IShellView_GetDetails((UINT)wParam, (PDETAILSINFO)lParam);
|
|
break;
|
|
|
|
//
|
|
// Background enumeration only works for default shell view.
|
|
//
|
|
|
|
//case SFVM_BACKGROUNDENUM:
|
|
// hr = S_OK;
|
|
// TraceMsg(TF_CDFENUM, "Enum Background thread callback tid:0x%x",
|
|
// GetCurrentThreadId());
|
|
// break;
|
|
|
|
default:
|
|
hr = E_FAIL;
|
|
break;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
|
|
//
|
|
// *** IShellView_GetDetails ***
|
|
//
|
|
//
|
|
// Description:
|
|
// The IShellView callback DVM_GETDETAILSOF message handler.
|
|
//
|
|
// Parameters:
|
|
// [In] nColumn - The column for wich information is requested.
|
|
// [InOut] pDetails - For column headings the pidl param is NULL and the
|
|
// columns format, width, and title are returned. For
|
|
// items the pidl member conatins the id list of the
|
|
// requested item and the string value of the requested
|
|
// item is returned.
|
|
//
|
|
// Return:
|
|
// S_OK if nColumn is supported.
|
|
// E_FAIL if nColumn is greater than the number of supported columns.
|
|
//
|
|
// Comments:
|
|
// The default shell view calls this function with successively higher
|
|
// column numbers until an E_FAIL is returned.
|
|
//
|
|
// The first (0) column is the display name.
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT
|
|
IShellView_GetDetails(
|
|
UINT nColumn,
|
|
PDETAILSINFO pDetails
|
|
)
|
|
{
|
|
//
|
|
// Column information.
|
|
//
|
|
|
|
#define COLUMNS (sizeof(aColumnInfo) / sizeof(aColumnInfo[0]))
|
|
|
|
static const struct _tagCOLUMNINFO
|
|
{
|
|
UINT idsName;
|
|
UINT cchWidth;
|
|
USHORT uFormat;
|
|
}
|
|
aColumnInfo[] = {
|
|
{IDS_COLUMN_NAME, 50, LVCFMT_LEFT}
|
|
};
|
|
|
|
HRESULT hr;
|
|
|
|
if (nColumn < COLUMNS)
|
|
{
|
|
if (NULL != pDetails->pidl) {
|
|
|
|
//
|
|
// Get item information from the pidl.
|
|
//
|
|
|
|
switch (aColumnInfo[nColumn].idsName)
|
|
{
|
|
case IDS_COLUMN_NAME:
|
|
//pDetails->str.uType = STRRET_CSTR;
|
|
CDFIDL_GetDisplayName((PCDFITEMIDLIST)pDetails->pidl,
|
|
&pDetails->str);
|
|
break;
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// Get column heading information.
|
|
//
|
|
|
|
pDetails->fmt = aColumnInfo[nColumn].uFormat;
|
|
pDetails->cxChar = aColumnInfo[nColumn].cchWidth;
|
|
pDetails->str.uType = STRRET_CSTR;
|
|
|
|
//
|
|
// REVIEW: Using MLLoadStringA.
|
|
//
|
|
|
|
MLLoadStringA(aColumnInfo[nColumn].idsName,
|
|
pDetails->str.cStr, sizeof(pDetails->str.cStr));
|
|
}
|
|
|
|
hr = S_OK;
|
|
}
|
|
else
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
|
|
return hr;
|
|
}
|