#if !defined(AFX_SCOPEPANE_H__7D4A6859_9056_11D2_BD45_0000F87A3912__INCLUDED_)
#define AFX_SCOPEPANE_H__7D4A6859_9056_11D2_BD45_0000F87A3912__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// ScopePane.h : header file
//

#include <mmc.h>
#include "ScopePaneItem.h"
#include "ResultsPaneItem.h"
#include "ResultsPaneView.h"
#include "ResultsPane.h"
#include "SnapinDataObject.h"
#include "MmcMsgHook.h"

typedef CTypedPtrArray<CObArray,CResultsPane*> ResultsPaneArray;

/////////////////////////////////////////////////////////////////////////////
// CScopePane command target

class CScopePane : public CCmdTarget
{

DECLARE_DYNCREATE(CScopePane)

// Construction/Destruction
public:
	CScopePane();
	virtual ~CScopePane();

// Creation/Destruction Overrideable Members
protected:
	virtual bool OnCreate();
	virtual LPCOMPONENT OnCreateComponent();
	virtual bool OnDestroy();

// Root Scope Pane Item Members
public:
	virtual CScopePaneItem* CreateRootScopeItem();
	CScopePaneItem* GetRootScopeItem();
	void SetRootScopeItem(CScopePaneItem* pRootItem);
protected:
	CScopePaneItem* m_pRootItem;

// MMC Frame Window Message Hook Members
public:
	bool HookWindow();
	void UnhookWindow();
protected:
	CMmcMsgHook* m_pMsgHook;

// MMC Interface Members
public:
	LPCONSOLENAMESPACE2 GetConsoleNamespacePtr();
	LPCONSOLE2 GetConsolePtr();
	LPIMAGELIST GetImageListPtr();
	LPUNKNOWN GetCustomOcxPtr();
protected:
	LPCONSOLENAMESPACE2 m_pIConsoleNamespace;
	LPCONSOLE2 m_pIConsole;
	LPIMAGELIST m_pIImageList;

// MMC Scope Pane Helper Members
public:
	CScopePaneItem* GetSelectedScopeItem();
	void SetSelectedScopeItem(CScopePaneItem* pItem);
protected:
	CScopePaneItem* m_pSelectedScopeItem;

// Scope Item Icon Management
public:
	int AddIcon(UINT nIconResID);
	int GetIconIndex(UINT nIconResID);
	int GetIconCount();
	void RemoveAllIcons();
protected:
	CMap<UINT,UINT,int,int> m_IconMap;

// Results Pane Members
public:	
	int GetResultsPaneCount() const;
	CResultsPane* GetResultsPane(int iIndex);
	int AddResultsPane(CResultsPane* pPane);
	void RemoveResultsPane(int iIndex);
protected:
	ResultsPaneArray m_ResultsPanes;

// Serialization
public:
	virtual bool OnLoad(CArchive& ar);
	virtual bool OnSave(CArchive& ar);

// MMC Help
public:
  bool ShowTopic(const CString& sHelpTopic);

// MFC Operations
public:

// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CScopePane)
	public:
	virtual void OnFinalRelease();
	//}}AFX_VIRTUAL

// MFC Implementation
protected:

	// Generated message map functions
	//{{AFX_MSG(CScopePane)
		// NOTE - the ClassWizard will add and remove member functions here.
	//}}AFX_MSG

	DECLARE_MESSAGE_MAP()

	// Generated OLE dispatch map functions
	//{{AFX_DISPATCH(CScopePane)
		// NOTE - the ClassWizard will add and remove member functions here.
	//}}AFX_DISPATCH
	DECLARE_DISPATCH_MAP()
	DECLARE_INTERFACE_MAP()

	////////////////////////////////
	// IComponentData Interface Part
	
	BEGIN_INTERFACE_PART(ComponentData,IComponentData)

		/* [helpstring] */ HRESULT STDMETHODCALLTYPE Initialize( 
				/* [in] */ LPUNKNOWN pUnknown);
  
		/* [helpstring] */ HRESULT STDMETHODCALLTYPE CreateComponent( 
				/* [out] */ LPCOMPONENT __RPC_FAR *ppComponent);
  
		/* [helpstring] */ HRESULT STDMETHODCALLTYPE Notify( 
				/* [in] */ LPDATAOBJECT lpDataObject,
				/* [in] */ MMC_NOTIFY_TYPE event,
				/* [in] */ LPARAM arg,
				/* [in] */ LPARAM param);
  
		/* [helpstring] */ HRESULT STDMETHODCALLTYPE Destroy( void);
  
		/* [helpstring] */ HRESULT STDMETHODCALLTYPE QueryDataObject( 
				/* [in] */ MMC_COOKIE cookie,
				/* [in] */ DATA_OBJECT_TYPES type,
				/* [out] */ LPDATAOBJECT __RPC_FAR *ppDataObject);
  
		/* [helpstring] */ HRESULT STDMETHODCALLTYPE GetDisplayInfo( 
				/* [out][in] */ SCOPEDATAITEM __RPC_FAR *pScopeDataItem);
  
		/* [helpstring] */ HRESULT STDMETHODCALLTYPE CompareObjects( 
				/* [in] */ LPDATAOBJECT lpDataObjectA,
				/* [in] */ LPDATAOBJECT lpDataObjectB);

	END_INTERFACE_PART(ComponentData)


	////////////////////////////////
	// IPersistStream Interface Part

	BEGIN_INTERFACE_PART(PersistStream,IPersistStream)

    HRESULT STDMETHODCALLTYPE GetClassID( 
        /* [out] */ CLSID __RPC_FAR *pClassID);

		HRESULT STDMETHODCALLTYPE IsDirty( void);
  
		HRESULT STDMETHODCALLTYPE Load( 
				/* [unique][in] */ IStream __RPC_FAR *pStm);
  
		HRESULT STDMETHODCALLTYPE Save( 
				/* [unique][in] */ IStream __RPC_FAR *pStm,
				/* [in] */ BOOL fClearDirty);
  
		HRESULT STDMETHODCALLTYPE GetSizeMax( 
				/* [out] */ ULARGE_INTEGER __RPC_FAR *pcbSize);

	END_INTERFACE_PART(PersistStream)

	////////////////////////////////
	// IExtendContextMenu Interface Part

	BEGIN_INTERFACE_PART(ExtendContextMenu,IExtendContextMenu)

    /* [helpstring] */ HRESULT STDMETHODCALLTYPE AddMenuItems( 
        /* [in] */ LPDATAOBJECT piDataObject,
        /* [in] */ LPCONTEXTMENUCALLBACK piCallback,
        /* [out][in] */ long __RPC_FAR *pInsertionAllowed);
    
    /* [helpstring] */ HRESULT STDMETHODCALLTYPE Command( 
        /* [in] */ long lCommandID,
        /* [in] */ LPDATAOBJECT piDataObject);

	END_INTERFACE_PART(ExtendContextMenu)

	////////////////////////////////
	// IExtendPropertySheet2 Interface Part

	BEGIN_INTERFACE_PART(ExtendPropertySheet2,IExtendPropertySheet2)

    /* [helpstring] */ HRESULT STDMETHODCALLTYPE CreatePropertyPages( 
        /* [in] */ LPPROPERTYSHEETCALLBACK lpProvider,
        /* [in] */ LONG_PTR handle,
        /* [in] */ LPDATAOBJECT lpIDataObject);
    
    /* [helpstring] */ HRESULT STDMETHODCALLTYPE QueryPagesFor( 
        /* [in] */ LPDATAOBJECT lpDataObject);

		/* [helpstring] */ HRESULT STDMETHODCALLTYPE GetWatermarks( 
				/* [in] */ LPDATAOBJECT lpIDataObject,
				/* [out] */ HBITMAP __RPC_FAR *lphWatermark,
				/* [out] */ HBITMAP __RPC_FAR *lphHeader,
				/* [out] */ HPALETTE __RPC_FAR *lphPalette,
				/* [out] */ BOOL __RPC_FAR *bStretch);

	END_INTERFACE_PART(ExtendPropertySheet2)

	////////////////////////////////
	// ISnapinHelp Interface Part

	BEGIN_INTERFACE_PART(SnapinHelp,ISnapinHelp)

    /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetHelpTopic( 
        /* [out] */ LPOLESTR __RPC_FAR *lpCompiledHelpFile);

	END_INTERFACE_PART(SnapinHelp)

};

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_SCOPEPANE_H__7D4A6859_9056_11D2_BD45_0000F87A3912__INCLUDED_)