Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

247 lines
8.1 KiB

/*++
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
As items are selected and deselected, snap-ins are activated and deactivated.
When a snap-in is activated, the console calls SetControlbar with a non-NULL
pControlbar value. The snap-in should call AddRef on this IControlBar. The
snap-in should also use this opportunity to attach controls. Similarly, when
the snap-in is deactivated, the console calls SetControlbar with a NULL
pControlbar. The snap-in should then detach its controls and call Release
on the saved IControlBar.
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
--*/
{
// The snap-in should return S_FALSE for any notification it does not handle.
// MMC then performs a default operation for the notification.
HRESULT hr = S_FALSE;
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
{
// The MMCN_BTN_CLICK notification is sent to the snap-in's IComponent,
// IComponentData, or IExtendControlbar implementation when a user clicks
// one of the toolbar buttons.
//
// For IExtendControlBar::ControlbarNotify:
// arg: Data object of the currently selected scope or result item.
// param: [in] The snap-in-defined command ID of the selected toolbar button.
p_DataObject = (LPDATAOBJECT)i_lArg;
// Get the display object from IDataObject
hr = m_pScopeManager->GetDisplayObject(p_DataObject, &pCMmcDisplayObj);
if (SUCCEEDED(hr))
hr = pCMmcDisplayObj->ToolbarClick(m_pControlbar, i_lParam);
break;
}
case MMCN_SELECT: // A node is being selected\deselected
{
// The MMCN_SELECT notification is sent to the snap-in's IComponent::Notify
// or IExtendControlbar::ControlbarNotify method when an item is selected
// in either the scope pane or result pane.
//
// For IExtendControlbar::ControlbarNotify:
// arg: BOOL bScope = (BOOL) LOWORD(arg); BOOL bSelect = (BOOL) HIWORD(arg);
// bScope is TRUE if an item in the scope pane is selected, or FALSE
// if an item in the result pane is selected.
// bSelect is TRUE if the item is selected, or FALSE if the item is deselected.
// param: LPDATAOBJECT pDataobject = (LPDATAOBJECT)param;
// pDataobject is the data object of the item being selected or deselected.
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);
//
// 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.
//
BOOL bSelect = (BOOL) HIWORD(i_lArg);
IToolbar *pToolbar = NULL;
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);
pToolbar = (IToolbar *)m_pMMCAdminToolBar;
break;
case DISPLAY_OBJECT_TYPE_ROOT:
if (!m_pMMCRootToolBar)
hr = pCMmcDisplayObj->CreateToolbar(m_pControlbar, (LPEXTENDCONTROLBAR)this, &m_pMMCRootToolBar);
pToolbar = (IToolbar *)m_pMMCRootToolBar;
break;
case DISPLAY_OBJECT_TYPE_JUNCTION:
if (!m_pMMCJPToolBar)
hr = pCMmcDisplayObj->CreateToolbar(m_pControlbar, (LPEXTENDCONTROLBAR)this, &m_pMMCJPToolBar);
pToolbar = (IToolbar *)m_pMMCJPToolBar;
break;
case DISPLAY_OBJECT_TYPE_REPLICA:
if (!m_pMMCReplicaToolBar)
hr = pCMmcDisplayObj->CreateToolbar(m_pControlbar, (LPEXTENDCONTROLBAR)this, &m_pMMCReplicaToolBar);
pToolbar = (IToolbar *)m_pMMCReplicaToolBar;
break;
}
if (SUCCEEDED(hr))
{
if (bSelect)
{
DetachAllToolbars();
m_pControlbar->Attach(TOOLBAR, (LPUNKNOWN)pToolbar);
}
hr = pCMmcDisplayObj->ToolbarSelect(i_lArg, pToolbar);
}
break;
}
default:
break;
} // switch()
return hr;
}