|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997.
//
// File: C M D T A B L E . C P P
//
// Contents: Command-table code -- determines which menu options are
// available by the selection count, among other criteria
//
// Notes:
//
// Author: jeffspr 28 Jan 1998
//
//----------------------------------------------------------------------------
#include "pch.h"
#pragma hdrstop
#include "upsres.h" // Folder resource IDs
#include "cmdtable.h" // Header for this file
// Enable this if we have checked items
//
// #define CHECKED_ITEMS_PRESENT 1
//---[ Prototypes ]-----------------------------------------------------------
VOID DoMenuItemExceptionLoop( LPCITEMIDLIST * apidlSelected, DWORD cPidl);
VOID DoMenuItemCheckLoop(VOID);
COMMANDTABLEENTRY g_cteFolderCommands[] = { // command id
// | valid when 0 items selected
// | |
// | | valid when multiple items selected
// | | | command is currently enabled
// | | | | new state (temp)
// | | | | |
// | | | | |
// | | | | |
// | | | | |
// v v v v v
//
{ CMIDM_CREATE_SHORTCUT, false, false, true, true }, { SFVIDM_FILE_LINK, false, false, true, true }, { CMIDM_DELETE, false, false, false, true }, { SFVIDM_FILE_DELETE, false, false, false, true }, { CMIDM_RENAME, false, false, true, true }, { SFVIDM_FILE_RENAME, false, false, true, true }, { CMIDM_PROPERTIES, false, false, true, true }, { SFVIDM_FILE_PROPERTIES, false, false, true, true }, { CMIDM_ARRANGE_BY_NAME, true, true, true, true }, { CMIDM_ARRANGE_BY_URL, true, true, true, true }, { CMIDM_INVOKE, false, false, true, true } };
const DWORD g_nFolderCommandCount = celems(g_cteFolderCommands);
//+---------------------------------------------------------------------------
//
// Function: HrEnableOrDisableMenuItems
//
// Purpose: Enable, disable, and or check/uncheck menu items depending
// on the current selection count, as well as exceptions for
// the type and state of the connections themselves
//
// Arguments:
// hwnd [in] Our window handle
// apidlSelected [in] Currently selected objects
// cPidl [in] Number selected
// hmenu [in] Our command menu handle
// idCmdFirst [in] First valid command
//
// Returns:
//
// Author: jeffspr 2 Feb 1998
//
// Notes:
//
HRESULT HrEnableOrDisableMenuItems( HWND hwnd, LPCITEMIDLIST * apidlSelected, DWORD cPidl, HMENU hmenu, UINT idCmdFirst) { HRESULT hr = S_OK; DWORD dwLoop = 0;
// Loop through, and set the new state, based on the selection
// count compared to the flags for 0-select and multi-select
//
for (dwLoop = 0; dwLoop < g_nFolderCommandCount; dwLoop++) { // If nothing is selected, then check the current state, and
// if different, adjust
//
if (cPidl == 0) { g_cteFolderCommands[dwLoop].fNewState = g_cteFolderCommands[dwLoop].fValidOnZero; } else { // If singly-selected, then by default, we're always on.
//
if (cPidl == 1) { g_cteFolderCommands[dwLoop].fNewState = g_cteFolderCommands[dwLoop].fValidOnSingle; } else { // Multi-selected
//
g_cteFolderCommands[dwLoop].fNewState = g_cteFolderCommands[dwLoop].fValidOnMultiple; } } }
for (dwLoop = 0; dwLoop < g_nFolderCommandCount; dwLoop++) { DWORD dwCommandId = 0;
switch(g_cteFolderCommands[dwLoop].iCommandId) { case SFVIDM_FILE_DELETE: case SFVIDM_FILE_RENAME: case SFVIDM_FILE_LINK: case SFVIDM_FILE_PROPERTIES: dwCommandId = g_cteFolderCommands[dwLoop].iCommandId; break; default: dwCommandId = g_cteFolderCommands[dwLoop].iCommandId + idCmdFirst - CMIDM_FIRST; break; }
// Enable or disable the menu item, as appopriate
//
EnableMenuItem(hmenu, dwCommandId, g_cteFolderCommands[dwLoop].fNewState ? MF_ENABLED | MF_BYCOMMAND : // enable
MF_GRAYED | MF_BYCOMMAND); // disable
}
TraceHr(ttidShellFolder, FAL, hr, FALSE, "HrEnableOrDisableMenuItems"); return hr; }
//+---------------------------------------------------------------------------
//
// Function: DoMenuItemExceptionLoop
//
// Purpose: Check for various menu item exceptions.
//
// Arguments:
// apidlSelected [in] Selected items
// cPidl [in] Count of selected items
//
// Returns:
//
// Author: jeffspr 26 Feb 1998
//
// Notes:
//
VOID DoMenuItemExceptionLoop( LPCITEMIDLIST * apidlSelected, DWORD cPidl) { DWORD dwLoop = 0; DWORD dwObjectLoop = 0; bool fEnableDelete = false; // For now, this is ALWAYS disabled (jeffspr)
bool fEnableRename = true;
if (cPidl) { // Loop through each of the selected objects
//
for (dwObjectLoop = 0; dwObjectLoop < cPidl; dwObjectLoop++) { // Validate the pidls
//
PUPNPDEVICEFOLDPIDL pudfp = NULL;
if (!(apidlSelected[dwObjectLoop]) || ILIsEmpty(apidlSelected[dwObjectLoop])) { AssertSz(FALSE, "Bogus pidl array in DoMenuItemExceptionLoop (status)"); } else { pudfp = ConvertToUPnPDevicePIDL(apidlSelected[dwObjectLoop]); }
if (pudfp) { // Loop through the commands
//
for (dwLoop = 0; dwLoop < g_nFolderCommandCount; dwLoop++) { // Only allow items to be changed to ENABLED states when they're
// previously DISABLED
//
if (g_cteFolderCommands[dwLoop].fNewState) { } } } }
// Loop through the commands, and disable the commands, if appropriate
//
for (dwLoop = 0; dwLoop < g_nFolderCommandCount; dwLoop++) { switch(g_cteFolderCommands[dwLoop].iCommandId) { case CMIDM_DELETE: case SFVIDM_FILE_DELETE: g_cteFolderCommands[dwLoop].fNewState = fEnableDelete; break; case CMIDM_RENAME: case SFVIDM_FILE_RENAME: g_cteFolderCommands[dwLoop].fNewState = fEnableRename; break; default: break; } } } }
|