247 lines
6.7 KiB
C++
247 lines
6.7 KiB
C++
|
/*++
|
||
|
Module Name:
|
||
|
|
||
|
MmcAdmin.cpp
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This module contains the part of the declaration for CDfsSnapinResultManager.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "DfsGUI.h"
|
||
|
#include "DfsReslt.h"
|
||
|
#include "DfsScope.h" // The CDfsSnapinScopeManager class
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
STDMETHODIMP CDfsSnapinResultManager :: AddMenuItems
|
||
|
(
|
||
|
IN LPDATAOBJECT i_lpDataObject,
|
||
|
IN LPCONTEXTMENUCALLBACK i_lpContextMenuCallback,
|
||
|
IN LPLONG i_lpInsertionAllowed
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
This routine adds the appropriate context menu using the ContextMenuCallback provided.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
i_lpDataObject - The dataobject used to identify the node.
|
||
|
i_lpContextMenuCallback - A callback(function pointer) that is used to add the menu items
|
||
|
i_lpInsertionAllowed - Specifies what menus can be added and where they can be added.
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
RETURN_INVALIDARG_IF_NULL(i_lpDataObject);
|
||
|
RETURN_INVALIDARG_IF_NULL(i_lpContextMenuCallback);
|
||
|
RETURN_INVALIDARG_IF_NULL(i_lpInsertionAllowed);
|
||
|
|
||
|
if (DOBJ_CUSTOMOCX == i_lpDataObject)
|
||
|
return S_OK;
|
||
|
|
||
|
return m_pScopeManager->AddMenuItems(i_lpDataObject, i_lpContextMenuCallback, i_lpInsertionAllowed);
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CDfsSnapinResultManager::Command(
|
||
|
IN LONG i_lCommandID,
|
||
|
IN LPDATAOBJECT i_lpDataObject
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Action to be taken on a context menu selection or click is takes place.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
i_lpDataObject - The dataobject used to identify the node.
|
||
|
i_lCommandID - The Command ID of the menu for which action has to be taken
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
RETURN_INVALIDARG_IF_NULL(i_lpDataObject);
|
||
|
|
||
|
return m_pScopeManager->Command(i_lCommandID, i_lpDataObject);
|
||
|
}
|
||
|
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CDfsSnapinResultManager::SetControlbar(
|
||
|
IN LPCONTROLBAR i_pControlbar
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Called by MMC to allow us to set the IControlbar interface pointer
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
i_pControlbar - The IControlbar interface pointer. Note, can be 0.
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
if (!i_pControlbar) // We are shutting down
|
||
|
m_pControlbar.Release();
|
||
|
else
|
||
|
m_pControlbar = i_pControlbar;
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
void
|
||
|
CDfsSnapinResultManager::DetachAllToolbars()
|
||
|
{
|
||
|
if (m_pMMCAdminToolBar)
|
||
|
m_pControlbar->Detach(m_pMMCAdminToolBar);
|
||
|
if (m_pMMCRootToolBar)
|
||
|
m_pControlbar->Detach(m_pMMCRootToolBar);
|
||
|
if (m_pMMCJPToolBar)
|
||
|
m_pControlbar->Detach(m_pMMCJPToolBar);
|
||
|
if (m_pMMCReplicaToolBar)
|
||
|
m_pControlbar->Detach(m_pMMCReplicaToolBar);
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CDfsSnapinResultManager::ControlbarNotify(
|
||
|
IN MMC_NOTIFY_TYPE i_Event,
|
||
|
IN LPARAM i_lArg,
|
||
|
IN LPARAM i_lParam
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Called by MMC to notify the toolbar about an event.
|
||
|
This can be selection\disselection of node, click on a toolbar, etc.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
i_Event - The event that occurred.
|
||
|
i_lArg - The argument for the event. Depends on the event
|
||
|
i_lParam - The parameter for the event. Depends on the event
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
LPDATAOBJECT p_DataObject = NULL;
|
||
|
CMmcDisplay* pCMmcDisplayObj = NULL;
|
||
|
|
||
|
switch (i_Event) // Decide which method to call of the display object
|
||
|
{
|
||
|
case MMCN_BTN_CLICK: // Click on a toolbar
|
||
|
{
|
||
|
p_DataObject = (LPDATAOBJECT)i_lArg;
|
||
|
|
||
|
// Get the display object from IDataObject
|
||
|
hr = m_pScopeManager->GetDisplayObject(p_DataObject, &pCMmcDisplayObj);
|
||
|
RETURN_IF_FAILED(hr);
|
||
|
// Ask the display object to handle click on the toolbar
|
||
|
hr = pCMmcDisplayObj->ToolbarClick(m_pControlbar, i_lParam);
|
||
|
RETURN_IF_FAILED(hr);
|
||
|
break;
|
||
|
}
|
||
|
case MMCN_SELECT: // A node is being selected\deselected
|
||
|
{
|
||
|
BOOL bSelect = (BOOL) HIWORD(i_lArg);
|
||
|
p_DataObject = (LPDATAOBJECT)i_lParam;
|
||
|
|
||
|
if (DOBJ_CUSTOMOCX == p_DataObject)
|
||
|
break;
|
||
|
// Get the display object from IDataObject
|
||
|
hr = m_pScopeManager->GetDisplayObject(p_DataObject, &pCMmcDisplayObj);
|
||
|
RETURN_IF_FAILED(hr);
|
||
|
|
||
|
// Create the appropriate tool bar if it is
|
||
|
// Not created.
|
||
|
// Then ask the display object to handle selection
|
||
|
//
|
||
|
// Update the custom toolbars.
|
||
|
// On select, it should detach unused toolbars and attach new ones as needed.
|
||
|
// On deselect, to minimize flashing, it should not detach toolbars; it is
|
||
|
// best to disable them, but doing nothing on deselect is also acceptable.
|
||
|
//
|
||
|
DISPLAY_OBJECT_TYPE DisplayObType = pCMmcDisplayObj->GetDisplayObjectType();
|
||
|
switch (DisplayObType)
|
||
|
{
|
||
|
case DISPLAY_OBJECT_TYPE_ADMIN:
|
||
|
if (!m_pMMCAdminToolBar)
|
||
|
{
|
||
|
hr = pCMmcDisplayObj->CreateToolbar(m_pControlbar, (LPEXTENDCONTROLBAR)this, &m_pMMCAdminToolBar);
|
||
|
RETURN_IF_FAILED(hr);
|
||
|
}
|
||
|
|
||
|
if (bSelect)
|
||
|
{
|
||
|
DetachAllToolbars();
|
||
|
m_pControlbar->Attach(TOOLBAR, (LPUNKNOWN) m_pMMCAdminToolBar);
|
||
|
}
|
||
|
|
||
|
hr = pCMmcDisplayObj->ToolbarSelect(i_lArg, m_pMMCAdminToolBar);
|
||
|
break;
|
||
|
case DISPLAY_OBJECT_TYPE_ROOT:
|
||
|
if (!m_pMMCRootToolBar)
|
||
|
{
|
||
|
hr = pCMmcDisplayObj->CreateToolbar(m_pControlbar, (LPEXTENDCONTROLBAR)this, &m_pMMCRootToolBar);
|
||
|
RETURN_IF_FAILED(hr);
|
||
|
}
|
||
|
|
||
|
if (bSelect)
|
||
|
{
|
||
|
DetachAllToolbars();
|
||
|
m_pControlbar->Attach(TOOLBAR, (LPUNKNOWN) m_pMMCRootToolBar);
|
||
|
}
|
||
|
|
||
|
hr = pCMmcDisplayObj->ToolbarSelect(i_lArg, m_pMMCRootToolBar);
|
||
|
break;
|
||
|
case DISPLAY_OBJECT_TYPE_JUNCTION:
|
||
|
if (!m_pMMCJPToolBar)
|
||
|
{
|
||
|
hr = pCMmcDisplayObj->CreateToolbar(m_pControlbar, (LPEXTENDCONTROLBAR)this, &m_pMMCJPToolBar);
|
||
|
RETURN_IF_FAILED(hr);
|
||
|
}
|
||
|
|
||
|
if (bSelect)
|
||
|
{
|
||
|
DetachAllToolbars();
|
||
|
m_pControlbar->Attach(TOOLBAR, (LPUNKNOWN) m_pMMCJPToolBar);
|
||
|
}
|
||
|
|
||
|
hr = pCMmcDisplayObj->ToolbarSelect(i_lArg, m_pMMCJPToolBar);
|
||
|
break;
|
||
|
case DISPLAY_OBJECT_TYPE_REPLICA:
|
||
|
if (!m_pMMCReplicaToolBar)
|
||
|
{
|
||
|
hr = pCMmcDisplayObj->CreateToolbar(m_pControlbar, (LPEXTENDCONTROLBAR)this, &m_pMMCReplicaToolBar);
|
||
|
RETURN_IF_FAILED(hr);
|
||
|
}
|
||
|
|
||
|
if (bSelect)
|
||
|
{
|
||
|
DetachAllToolbars();
|
||
|
m_pControlbar->Attach(TOOLBAR, (LPUNKNOWN) m_pMMCReplicaToolBar);
|
||
|
}
|
||
|
|
||
|
hr = pCMmcDisplayObj->ToolbarSelect(i_lArg, m_pMMCReplicaToolBar);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
} // switch()
|
||
|
|
||
|
return hr;
|
||
|
}
|