mirror of https://github.com/tongzx/nt5src
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
7.5 KiB
247 lines
7.5 KiB
// Copyright (C) 1997 Microsoft Corporation
|
|
//
|
|
// Scope Node class
|
|
//
|
|
// 9-4-97 sburns
|
|
|
|
|
|
|
|
#ifndef SCOPNODE_HPP_INCLUDED
|
|
#define SCOPNODE_HPP_INCLUDED
|
|
|
|
|
|
|
|
#include "node.hpp"
|
|
|
|
|
|
|
|
// Struct used by BuildResultColumns. Should be nested in ScopeNode, but vc++
|
|
// templates seem to have trouble with nested classes as parameters.
|
|
|
|
struct ResultColumn
|
|
{
|
|
int colTextResID; // header text string resource ID
|
|
int colWidthResID; // string with decimal integer pixel width
|
|
};
|
|
|
|
|
|
|
|
// ScopeNode instances represent items appearing in the scope pane. An
|
|
// instance of ScopeNode "owns" the items (which are ResultNode instances) to
|
|
// be displayed in the result pane when that instance is expanded in the scope
|
|
// pane.
|
|
|
|
class ScopeNode : public Node
|
|
{
|
|
public:
|
|
|
|
// Returns the text to be displayed in the description bar of the result
|
|
// pane when the node is shown. The default implementation returns the
|
|
// empty string.
|
|
|
|
virtual
|
|
String
|
|
GetDescriptionBarText();
|
|
|
|
// Returns the number of scope children that will be inserted by
|
|
// InsertScopeChildren. The default implementation returns 0. If you
|
|
// don't know how many children you will have, return 1.
|
|
|
|
virtual
|
|
int
|
|
GetNumberOfScopeChildren();
|
|
|
|
// Returns the image index of the icon image for this node to be used then
|
|
// the node is shown in the "open" or expanded state. This is the index of
|
|
// the image that was registered with MMC by IComponent in response to the
|
|
// MMCN_ADD_IMAGES notification. This should always return the same index
|
|
// for all invocations.
|
|
|
|
virtual
|
|
int
|
|
GetOpenImageIndex() = 0;
|
|
|
|
// The default implementation returns MMC_VIEW_OPTIONS_NONE;
|
|
|
|
virtual
|
|
long
|
|
GetViewOptions();
|
|
|
|
// Called from IComponentData::Notify upon receipt of a MMCN_EXPAND
|
|
// notification. Derived classes should override this function to insert
|
|
// any subordinate ScopeNodes (*not* ResultNodes). The default
|
|
// implementation does nothing, and returns S_OK.
|
|
//
|
|
// nameSpace - The console's IConsoleNameSpace2 interface, obtained upon
|
|
// IComponentData::Initialize.
|
|
//
|
|
// scopeID - The HSCOPEITEM passed as the param argument to the MMCN_EXPAND
|
|
// notification.
|
|
|
|
virtual
|
|
HRESULT
|
|
InsertScopeChildren(
|
|
IConsoleNameSpace2& nameSpace,
|
|
HSCOPEITEM scopeID);
|
|
|
|
// Called by IComponent::Notify upon receipt of a MMCN_SHOW notification.
|
|
// Derived classes should provide an implementation which inserts columns
|
|
// for each of the columns supported by the node's owned items; that is,
|
|
// for each column for which the owned node's GetColumnText method will
|
|
// support.
|
|
//
|
|
// headerCtrl - The console's IHeaderCtrl interface, obtained upon
|
|
// IComponentData::Initialize
|
|
|
|
virtual
|
|
HRESULT
|
|
InsertResultColumns(IHeaderCtrl& headerCtrl) = 0;
|
|
|
|
// Called by IComponent::Notify upon receipt of a MMCN_SHOW notification,
|
|
// or MMCN_VIEW_CHANGE notification (where the arg indicates that the
|
|
// result pane is to be re-populated). Derived classes should iterate
|
|
// through their dependent ResultNodes, calling InsertIntoResultPane for
|
|
// each.
|
|
//
|
|
// resultData - The console's IResultData interface, obtained upon
|
|
// IComponentData::Initialize.
|
|
|
|
virtual
|
|
HRESULT
|
|
InsertResultItems(IResultData& resultData) = 0;
|
|
|
|
// Inserts self into the scope pane. Typically called from a parent
|
|
// ScopeNode's implementation of InsertScopeChildren.
|
|
//
|
|
// nameSpace - The console's IConsoleNameSpace2 interface, obtained upon
|
|
// IComponentData::Initialize.
|
|
//
|
|
// parentScopeID - The HSCOPEITEM passed as the param argument to the
|
|
// MMCN_EXPAND notification received by the parent ScopeNode, then passed
|
|
// to the parent ScopeNode's InsertScopeChildren
|
|
|
|
HRESULT
|
|
InsertIntoScopePane(
|
|
IConsoleNameSpace2& nameSpace,
|
|
HSCOPEITEM parentScopeID);
|
|
|
|
// Called by IComponent::Notify upon receipt of a MMCN_REFRESH
|
|
// notification, if the node's implementation of UpdateVerbs has enabled
|
|
// the MMC_VERB_REFERESH verb.
|
|
//
|
|
// Derived classes should release any dependent data, then rebuild it.
|
|
//
|
|
// The refresh cycle works like this:
|
|
// MMCN_REFRESH received for the ScopeNode
|
|
// - UpdateAllViews is called to clear the result pane of any view for
|
|
// which the current selected node is the same ScopeNode. This is
|
|
// done by comparing nodes and using IResultData::DeleteAllRsltItems.
|
|
// - ScopeNode::RebuildResultItems is called for the ScopeNode.
|
|
// - UpdateAllViews is called to repopulate the result pane of any view
|
|
// for which the current selected node is the same ScopeNode. This
|
|
// is done by comparing nodes and calling InsertResultItems for the
|
|
// ScopeNode.
|
|
|
|
virtual
|
|
HRESULT
|
|
RebuildResultItems();
|
|
|
|
// Removes self from the scope pane. Typically called from a parent
|
|
// ScopeNode's implementation of RemoveScopeChildren on it's children.
|
|
//
|
|
// If this node has scope pane children, then this call will cause
|
|
// MMCN_REMOVE_CHILDREN to be fired for this node, which will call
|
|
// RemoveScopeChildren for this node.
|
|
//
|
|
// nameSpace - the console's IConsoleNameSpace2 interface, obtained upon
|
|
// IComponentData::Initialize.
|
|
|
|
HRESULT
|
|
RemoveFromScopePane(IConsoleNameSpace2& nameSpace);
|
|
|
|
// Called from IComponentData::Notify upon receipt of a
|
|
// MMCN_REMOVE_CHILDREN notification. Derived classes should override this
|
|
// function to remove any subordinate ScopeNodes (*not* ResultNodes). The
|
|
// default implementation does nothing, and returns S_OK.
|
|
//
|
|
// nameSpace - The console's IConsoleNameSpace2 interface, obtained upon
|
|
// IComponentData::Initialize.
|
|
//
|
|
// parentScopeID - The HSCOPEITEM passed as the param argument to the
|
|
// MMCN_REMOVE_CHILDREN notification.
|
|
|
|
virtual
|
|
HRESULT
|
|
RemoveScopeChildren(
|
|
IConsoleNameSpace2& nameSpace,
|
|
HSCOPEITEM parentScopeID);
|
|
|
|
protected:
|
|
|
|
// Constructs a new instance. Declared protected to allow this class to
|
|
// only be a base class.
|
|
//
|
|
// owner - supplied to base class contructor
|
|
//
|
|
// nodeType - NodeType GUID supplied to the base class constructor.
|
|
|
|
ScopeNode(
|
|
const SmartInterface<ComponentData>& owner,
|
|
const NodeType& nodeType);
|
|
|
|
virtual ~ScopeNode();
|
|
|
|
// Helper function used to implement InsertResultColumns.
|
|
//
|
|
// begin - Iterator positioned to the beginning ResultColumn instance.
|
|
//
|
|
// end - Iterator positioned just beyond the last ResultColumn instance.
|
|
//
|
|
// headerCtrl - the IHeaderCtrl instance passed to InsertResultColumns.
|
|
|
|
template <class InputIterator>
|
|
HRESULT
|
|
BuildResultColumns(
|
|
InputIterator begin,
|
|
InputIterator end,
|
|
IHeaderCtrl& headerCtrl)
|
|
{
|
|
int col = 0;
|
|
HRESULT hr = S_OK;
|
|
for (
|
|
;
|
|
begin != end;
|
|
++begin)
|
|
{
|
|
int width = 0;
|
|
String::load((*begin).colWidthResID).convert(width);
|
|
|
|
// minimum width is 100 units.
|
|
width = max(100, width);
|
|
|
|
hr =
|
|
headerCtrl.InsertColumn(
|
|
col++,
|
|
String::load((*begin).colTextResID).c_str(),
|
|
LVCFMT_LEFT,
|
|
width);
|
|
BREAK_ON_FAILED_HRESULT(hr);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
private:
|
|
|
|
HSCOPEITEM item_id;
|
|
|
|
// not implemented: no copying allowed
|
|
|
|
ScopeNode(const ScopeNode&);
|
|
const ScopeNode& operator=(const ScopeNode&);
|
|
};
|
|
|
|
|
|
|
|
#endif // SCOPNODE_HPP_INCLUDED
|
|
|