windows-nt/Source/XPSP1/NT/admin/activec/nodemgr/task.h
2020-09-26 16:20:57 +08:00

373 lines
14 KiB
C++

/*--------------------------------------------------------------------------*
*
* Microsoft Windows
* Copyright (C) Microsoft Corporation, 1992 - 1999
*
* File: task.h
*
* Contents: Interface file for CConsoleTask
*
* History: 05-Oct-98 jeffro Created
*
*--------------------------------------------------------------------------*/
#ifndef TASK_H
#define TASK_H
#pragma once
#include "bookmark.h"
#include "refcount.h"
#include "tstring.h"
#include "menuitem.h"
#include "xmlicon.h" // for CXMLIcon
// forward declarations
class CConsoleTaskpad;
class CBookmarkEx;
class CStr;
typedef CConsoleTaskpad * PCONSOLETASKPAD;
#include <pshpack8.h> // for Win64
/*+-------------------------------------------------------------------------*
* CConsoleTask
*
*
*--------------------------------------------------------------------------*/
enum eConsoleTaskType
{
eTask_None, // invalid task type
eTask_Scope, // task for a scope item
eTask_Result, // task for a result item
eTask_CommandLine, // task for a command line
eTask_Target, // task for menu item on the target node.
eTask_Favorite // task for a favorite
};
enum eWindowState
{
eState_Restored,
eState_Minimized,
eState_Maximized,
};
/*+-------------------------------------------------------------------------*
* CConsoleTask
*
*
*--------------------------------------------------------------------------*/
class CConsoleTask : public CSerialObject, public CXMLObject
{
enum
{
eFlag_Disabled = 0x00000001,
};
bool operator==(const CConsoleTask & consoleTask) const; // private and unimplemented
public:
CConsoleTask ();
CConsoleTask(const CConsoleTask &rhs);
~CConsoleTask ();
static CConsoleTask * GetConsoleTask(DWORD dwUniqueID); // returns the console task that has the specified unique ID.
SC ScGetHTML(LPCTSTR szFmtHTML, CStr &strTaskHTML, bool bUseLargeIcons, bool bUseTextDescriptions) const; // get the HTML representation of the task.
// need an explicit copy ctor & assignment operator.
CConsoleTask& operator= (const CConsoleTask& rhs);
bool IsEnabled () const {return ((m_dwFlags & eFlag_Disabled) == 0);}
void SetDirty (bool fDirty = true) {m_fDirty = fDirty;}
bool IsDirty () const;
bool HasCustomIcon() const;
tstring GetName () const {return (m_strName.str()); }
tstring GetDescription () const {return (m_strDescription.str()); }
tstring GetCommand () const {return (m_strCommand); }
tstring GetParameters () const {return (m_strParameters); }
tstring GetDirectory () const {return (m_strDirectory); }
CMemento * GetMemento() {return &m_memento;}
void Draw (HDC hdc, RECT *lpRect, bool bSmall = false) const ; // Draw into a DC.
DWORD GetSymbol() const {return m_dwSymbol;}
const CSmartIcon & GetSmallCustomIcon() const {return m_smartIconCustomSmall;}
const CSmartIcon & GetLargeCustomIcon() const {return m_smartIconCustomLarge;}
DWORD GetUniqueID() const {return m_dwUniqueID;}// returns an ID unique to the task for the current process. Is not persistent.
void Enable (bool fEnable);
void SetName (const tstring& strName);
void SetDescription (const tstring& strDescription);
void SetCommand (const tstring& strCommand);
void SetParameters (const tstring& strParameters);
void SetDirectory (const tstring &strDirectory);
void SetMemento (const CMemento &memento);
void SetSymbol (DWORD dwSymbol);
void SetCustomIcon (CSmartIcon& iconSmall, CSmartIcon& iconLarge);
void ResetUI(); // signal to look for the target node again
void SetTaskType(eConsoleTaskType consoleTaskType)
{m_eConsoleTaskType = consoleTaskType;}
void SetWindowState (eWindowState eState);
eConsoleTaskType GetTaskType() const {return m_eConsoleTaskType;}
eWindowState GetWindowState() const {return m_eWindowState;}
CConsoleTaskpad* GetOwner () const { return (m_pctpOwner); }
void SetOwner (CConsoleTaskpad* pctpOwner);
bool operator==(const CMenuItem & menuItem) const;
// target node methods (scope tasks only)
bool RetargetScopeNode(CNode *pNewNode);
CMTNode * GetScopeNode(IScopeTree *pScopeTree) const;
std::auto_ptr<CNode> GetScopeNode(CViewData *pViewData) const;
private:
/*
* these are persisted
*/
eConsoleTaskType m_eConsoleTaskType;
CStringTableString m_strName;
CStringTableString m_strDescription;
DWORD m_dwSymbol; // the index of the built-in icon
CXMLIcon m_smartIconCustomLarge; // the large custom icon, if one exists
CXMLIcon m_smartIconCustomSmall; // the small custom icon, if one exists
tstring m_strCommand; // contains: either the menu item, or the command line.
tstring m_strParameters; // the list of arguments for command line tasks.
tstring m_strDirectory; // the default directory for command line tasks.
eWindowState m_eWindowState; // min, max, restored
DWORD m_dwFlags;
mutable CBookmarkEx m_bmScopeNode; // for scope tasks only.
CMemento m_memento; // for favorite tasks only.
/*
* these are not persisted
*/
bool m_fDirty;
CConsoleTaskpad* m_pctpOwner;
const DWORD m_dwUniqueID;
// CXMLObject methods
public:
DEFINE_XML_TYPE(XML_TAG_TASK);
virtual void Persist(CPersistor &persistor);
protected:
// CSerialObject methods
virtual UINT GetVersion() {return 1;}
virtual HRESULT ReadSerialObject (IStream &stm, UINT nVersion /*,LARGE_INTEGER nBytes*/);
};
/*+-------------------------------------------------------------------------*
* CTaskCollection
*
*
* PURPOSE: A list of console tasks. Used by CConsoleTaskpad.
*
*+-------------------------------------------------------------------------*/
typedef std::list<CConsoleTask> TaskCollection;
class CTaskCollection : public XMLListCollectionImp<TaskCollection>
{
DEFINE_XML_TYPE(XML_TAG_TASK_LIST);
};
/*+-------------------------------------------------------------------------*
* CConsoleTaskpad
*
*
*--------------------------------------------------------------------------*/
const DWORD TVO_HORIZONTAL = 0x0001;
const DWORD TVO_VERTICAL = 0x0002;
const DWORD TVO_NO_RESULTS = 0x0004;
const DWORD TVO_DESCRIPTIONS_AS_TEXT = 0x0008;
/*
* small list == large task area
*/
enum ListSize
{
eSize_None = -1,
eSize_Small = 1,
eSize_Medium,
eSize_Large,
eSize_Default= eSize_Medium
};
class CConsoleTaskpad : public CSerialObject, public CXMLObject
{
public:
CConsoleTaskpad (CNode* pTargetNode = NULL);
/*
* member-wise construction and assignment are sufficient
*/
// CConsoleTaskpad (const CConsoleTaskpad& other);
// CConsoleTaskpad& operator= (const CConsoleTaskpad& other);
void SetDirty (bool fDirty = true) { m_fDirty = fDirty; }
bool IsDirty () const;
bool HasTarget() const { return true;}
const GUID& GetNodeType () const { return (m_guidNodeType); }
const GUID& GetID() const { return (m_guidID);}
bool MatchesNodeType(const GUID& guid) const {return (guid == m_guidNodeType);}
bool MatchesID (const GUID& guid) const {return (guid == m_guidID);}
bool Retarget (CNode* pNewNode);
bool Retarget (CMTNode* pMTNewNode, bool fReset=false);
CMTNode* GetTargetMTNode (IScopeTree* pScopeTree);
tstring GetName () const { return (m_strName.str()); }
tstring GetDescription () const { return (m_strDescription.str()); }
tstring GetToolTip () const { return (m_strTooltip.str()); }
ListSize GetListSize() const { return m_listSize;}
bool IsNodeSpecific() const { return m_bNodeSpecific;}
bool FReplacesDefaultView() const { return m_bReplacesDefaultView;}
DWORD GetOrientation() const { return m_dwOrientation;}
bool IsValid(CNode *pNode) const; // is this taskpad appropriate for this node?
CMTNode* GetRetargetRootNode() const;
void SetName (const tstring& strName);
void SetDescription (const tstring& strDescription);
void SetToolTip (const tstring& strTooltip);
void SetListSize (const ListSize listSize);
void SetNodeSpecific (bool bNodeSpecific);
void SetReplacesDefaultView(bool bReplacesDefaultView);
void SetOrientation (DWORD dwOrientation) {m_dwOrientation = dwOrientation;}
void ResetUI();
CConsoleTaskpad * PConsoleTaskpad() {return this;} // an easy way to get to the object pointer thru an iterator.
SC ScGetHTML(CStr &strTaskpadHTML) const; // get the HTML representation of the taskpad.
/*
* task list access
*/
typedef CTaskCollection::iterator TaskIter;
typedef CTaskCollection::const_iterator TaskConstIter;
TaskIter BeginTask() const { return (m_Tasks.begin()); }
TaskIter EndTask() const { return (m_Tasks.end()); }
UINT TaskCount() const { return (static_cast<UINT>(m_Tasks.size())); }
TaskIter AddTask (const CConsoleTask& task);
TaskIter InsertTask (TaskIter itTaskBeforeWhichToInsert, const CConsoleTask& task);
TaskIter EraseTask (TaskIter itErase);
TaskIter EraseTasks (TaskIter itFirst, TaskIter itLast);
void ClearTasks ();
// CXMLObject methods
public:
DEFINE_XML_TYPE(XML_TAG_CONSOLE_TASKPAD);
virtual void Persist(CPersistor &persistor);
private:
CBookmarkEx & GetTargetBookmark() {return m_bmTargetNode;}
void ResetTargetNodePointer() {m_pMTNodeTarget = NULL;}
void SetStringMember(CStringTableString& strMember, const tstring& strNewValue);
private:
/*
* these are persisted
*/
CStringTableString m_strName;
CStringTableString m_strDescription;
CStringTableString m_strTooltip;
ListSize m_listSize; // the area of the the result pane occupied by the embedded view
bool m_bNodeSpecific; // is this taskpad specific to this node, or can it be used for all nodes of this type?
DWORD m_dwOrientation;
GUID m_guidNodeType;
GUID m_guidID; // the unique identifier of the taskpad.
mutable CBookmarkEx m_bmTargetNode;
CTaskCollection m_Tasks;
bool m_bReplacesDefaultView; // does this taskpad replace the default view?
/*
* these are not persisted
*/
bool m_fDirty;
CMTNode * m_pMTNodeTarget;
protected:
// CSerialObject methods
virtual UINT GetVersion() {return 1;}
virtual HRESULT ReadSerialObject (IStream &stm, UINT nVersion);
};
/*+-------------------------------------------------------------------------*
* CConsoleTaskpadFilteredList
*
*
* PURPOSE: Provides a list of taskpads appropriate to a given node.
*
*+-------------------------------------------------------------------------*/
class CConsoleTaskpadFilteredList : public std::list<PCONSOLETASKPAD>
{
iterator m_CurrentSelection; // the currently selected taskpad
};
/*+-------------------------------------------------------------------------*
* CConsoleTaskpadList
*
*
* PURPOSE: There should be only one object of this kind. This object contains
* a flat list of taskpads available. These are not sorted in any
* particular order.
*
*+-------------------------------------------------------------------------*/
typedef std::list<CConsoleTaskpad> CTaskpadList_base;
class CConsoleTaskpadList : public CSerialObject, public XMLListCollectionImp<CTaskpadList_base>
{
typedef std::list<CConsoleTaskpad> BC;
public: // find a taskpad for this node, else return NULL
SC ScGetTaskpadList(CNode *pNode, CConsoleTaskpadFilteredList &filteredList);
// CSerialObject methods
virtual UINT GetVersion() {return 1;}
virtual HRESULT ReadSerialObject (IStream &stm, UINT nVersion);
// CXMLObject methods
public:
DEFINE_XML_TYPE(XML_TAG_CONSOLE_TASKPADS);
};
/*+-------------------------------------------------------------------------*
* CDefaultTaskpadList
*
*
* PURPOSE: stores a map from nodetypes to console taskpad IDs
* This maps a nodetype to the default taskpad for that nodetype.
*
*+-------------------------------------------------------------------------*/
class CDefaultTaskpadList : public std::map<GUID, GUID>, // 1st = nodetype, 2nd = taskpad ID
public CSerialObject
{
public:
// CSerialObject methods
virtual UINT GetVersion() {return 1;}
virtual HRESULT ReadSerialObject (IStream &stm, UINT nVersion);
};
#include <poppack.h>
#endif // TASK_H