//+-------------------------------------------------------------------------
//
//  Microsoft Windows
//
//  Copyright (C) Microsoft Corporation, 1999 - 1999
//
//  File:       DsplMgr2.h
//
//--------------------------------------------------------------------------

// DsplMgr2.h : Declaration of the CDsplMgr2

#ifndef __DSPLMGR2_H_
#define __DSPLMGR2_H_

//#include "taskpad.h"
#include "resource.h"      // main symbols

using namespace ATL;

#define DISPLAY_MANAGER_WALLPAPER  1
#define DISPLAY_MANAGER_PATTERN    2
#define DISPLAY_MANAGER_PATTERN_CHILD 3

#define IDM_CENTER                     1
#define IDM_TILE                       2
#define IDM_STRETCH                    3
#define IDM_CUSTOMPAD                  4
#define IDM_TASKPAD                    5
#define IDM_TASKPAD_LISTVIEW           6
#define IDM_DEFAULT_LISTVIEW           7
#define IDM_DELETECHILDREN             8
#define IDM_RENAMEROOT                 9
#define IDM_TASKPAD_WALLPAPER_OPTIONS  10
#define IDM_CHANGEICON                 11
#define IDM_RENAMEWALL                 12
#define IDM_PRELOAD                    13
#define IDM_CONSOLEVERB                14

class CComponent;

struct lParamWallpaper {
   OLECHAR filename[MAX_PATH];
};

LPOLESTR CoTaskDupString (LPOLESTR szString);

/////////////////////////////////////////////////////////////////////////////
// CDsplMgr2
class ATL_NO_VTABLE CDsplMgr2 : 
   public CComObjectRootEx<CComSingleThreadModel>,
   public CComCoClass<CDsplMgr2, &CLSID_DsplMgr2>,
   public IPersistStream,
   public IComponentData
{
public:
	CDsplMgr2();
  ~CDsplMgr2();

DECLARE_REGISTRY_RESOURCEID(IDR_DSPLMGR2)
DECLARE_NOT_AGGREGATABLE(CDsplMgr2)

BEGIN_COM_MAP(CDsplMgr2)
	COM_INTERFACE_ENTRY(IComponentData)
   COM_INTERFACE_ENTRY(IPersistStream)
END_COM_MAP()

// IComponentData interface members
public:
   STDMETHOD(Initialize)(LPUNKNOWN pUnknown);
   STDMETHOD(CreateComponent)(LPCOMPONENT* ppComponent);
   STDMETHOD(Notify)(LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, long arg, long param);
   STDMETHOD(Destroy)();
   STDMETHOD(QueryDataObject)(long cookie, DATA_OBJECT_TYPES type, LPDATAOBJECT* ppDataObject);
   STDMETHOD(GetDisplayInfo)(SCOPEDATAITEM* pScopeDataItem);      
   STDMETHOD(CompareObjects)(LPDATAOBJECT lpDataObjectA, LPDATAOBJECT lpDataObjectB);

// IPersistStream interface members
   STDMETHOD(GetClassID)(CLSID *pClassID);
   STDMETHOD(IsDirty)();
   STDMETHOD(Load)(IStream *pStream);
   STDMETHOD(Save)(IStream *pStream, BOOL fClearDirty);
   STDMETHOD(GetSizeMax)(ULARGE_INTEGER *pcbSize);

public:
   long GetViewMode () { return m_ViewMode; }
   void SetViewMode (long vm) { m_ViewMode = vm; }
   HSCOPEITEM GetRoot () { return m_rootscopeitem; }
   HSCOPEITEM GetWallPaperNode () { return m_WallPaperNodeID; }
   BOOL       GetPreload () { return m_bPreload; }

	void myDeleteItem (HSCOPEITEM hsi, BOOL fDeleteThis) { m_lpIConsoleNameSpace->DeleteItem (hsi, fDeleteThis); }
	void myRenameItem (HSCOPEITEM hsi, LPOLESTR szName);
   void myChangeIcon (void);
   void myPreLoad (void);

private:
   HRESULT OnExpand (LPDATAOBJECT pDataObject, long arg, long param);

private:
   IConsole          * m_lpIConsole;
   IConsoleNameSpace * m_lpIConsoleNameSpace;
	IImageList        * m_lpIImageList;
   long                m_ViewMode;
   ATL::CComObject<class CComponent> * m_pComponent;
   HSCOPEITEM          m_rootscopeitem;
   HSCOPEITEM          m_patternscopeitem;
   HSCOPEITEM          m_WallPaperNodeID;    // 0 == unexpanded...
   BOOL                m_toggle;
   BOOL                m_bPreload;
};

class CEnumTasks : public IEnumTASK
{
public:
   CEnumTasks();
  ~CEnumTasks();

public:
// IUnknown implementation
   STDMETHOD(QueryInterface) (REFIID riid, LPVOID FAR* ppvObj);
   STDMETHOD_(ULONG, AddRef) ();
   STDMETHOD_(ULONG, Release) ();
private:
   ULONG m_refs;

public:
// IEnumTASKS implementation
   STDMETHOD(Next) (ULONG celt, MMC_TASK *rgelt, ULONG *pceltFetched);
   STDMETHOD(Skip) (ULONG celt);
   STDMETHOD(Reset)();
   STDMETHOD(Clone)(IEnumTASK **ppenum);
private:
   ULONG m_index;

public:
   HRESULT Init (IDataObject * pdo, LPOLESTR szTaskGroup);
private:
   void    GetBitmaps (void);
   HRESULT EnumBitmaps (ULONG celt, MMC_TASK *rgelt, ULONG *pceltFetched);
   HRESULT EnumOptions (ULONG celt, MMC_TASK *rgelt, ULONG *pceltFetched);
private:
   int m_type; // task grouping mechanism
   TCHAR * m_bmps;
};

class CDataObject:
   public IDataObject,
   public CComObjectRoot
{
public:

// ATL Maps
DECLARE_NOT_AGGREGATABLE(CDataObject)

BEGIN_COM_MAP(CDataObject)
	COM_INTERFACE_ENTRY(IDataObject)
END_COM_MAP()

private:
   CDataObject() {};
public:
   CDataObject(long cookie, DATA_OBJECT_TYPES type);
   ~CDataObject();

   // 
   // IUnknown overrides
   //
   STDMETHOD(QueryInterface) (REFIID riid, LPVOID FAR* ppvObj);
   STDMETHOD_(ULONG, AddRef) ();
   STDMETHOD_(ULONG, Release) ();
   //
   // IDataObject overrides
   //
   STDMETHOD(GetDataHere) (FORMATETC *pformatetc, STGMEDIUM *pmedium);

// Not Implemented
private:
   STDMETHOD(GetData)(LPFORMATETC lpFormatetcIn, LPSTGMEDIUM lpMedium)
   { return E_NOTIMPL; };
   STDMETHOD(EnumFormatEtc)(DWORD dwDirection, LPENUMFORMATETC* ppEnumFormatEtc)
   { return E_NOTIMPL; };
   STDMETHOD(QueryGetData)(LPFORMATETC lpFormatetc) 
   { return E_NOTIMPL; };
   STDMETHOD(GetCanonicalFormatEtc)(LPFORMATETC lpFormatetcIn, LPFORMATETC lpFormatetcOut)
   { return E_NOTIMPL; };
   STDMETHOD(SetData)(LPFORMATETC lpFormatetc, LPSTGMEDIUM lpMedium, BOOL bRelease)
   { return E_NOTIMPL; };
   STDMETHOD(DAdvise)(LPFORMATETC lpFormatetc, DWORD advf, LPADVISESINK pAdvSink, LPDWORD pdwConnection)
   { return E_NOTIMPL; };
   STDMETHOD(DUnadvise)(DWORD dwConnection)
   { return E_NOTIMPL; };
   STDMETHOD(EnumDAdvise)(LPENUMSTATDATA* ppEnumAdvise)
   { return E_NOTIMPL; };

public:  // my methods
   long GetCookie () { return m_cookie; }
   DATA_OBJECT_TYPES GetType () { return m_type; }
   void SetPreload (BOOL b) { m_bPreload = b; }

private:
   ULONG          m_ref;    // object reference counter
   long           m_cookie;
   DATA_OBJECT_TYPES m_type;
   BOOL           m_bPreload;

/*
   ULONG            m_cRefs;    // object refcount
   ULONG            m_ulCookie;  // what this obj refers to
   DATA_OBJECT_TYPES   m_Context;   // context in which this was created
   COOKIETYPE        m_Type;     // how to interpret _ulCookie
   CComponentData    *m_pcd;      // NULL if created by csnapin
*/

public:
   static UINT s_cfInternal;      // Our custom clipboard format
   static UINT s_cfDisplayName;   // Our test for a node
   static UINT s_cfNodeType;
   static UINT s_cfSnapinClsid;
   static UINT s_cfSnapinPreloads;
};

class CComponent:
   public IExtendTaskPad,
	public IComponent,
   public IExtendContextMenu,
   public CComObjectRoot
{
public:

// ATL Maps
DECLARE_NOT_AGGREGATABLE(CComponent)

BEGIN_COM_MAP(CComponent)
	COM_INTERFACE_ENTRY(IComponent)
   COM_INTERFACE_ENTRY(IExtendTaskPad)
   COM_INTERFACE_ENTRY(IExtendContextMenu)
END_COM_MAP()


   CComponent();
  ~CComponent();

	//
	// IComponent interface members
	//
   STDMETHOD(Initialize) (LPCONSOLE lpConsole);
   STDMETHOD(Notify) (LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, long arg, long param);
   STDMETHOD(Destroy) (long cookie);
   STDMETHOD(GetResultViewType) (long cookie,  LPOLESTR* ppViewType, long* pViewOptions);
   STDMETHOD(QueryDataObject) (long cookie, DATA_OBJECT_TYPES type, LPDATAOBJECT* ppDataObject);
   STDMETHOD(GetDisplayInfo) (RESULTDATAITEM*  pResultDataItem);
   STDMETHOD(CompareObjects) (LPDATAOBJECT lpDataObjectA, LPDATAOBJECT lpDataObjectB);

// IExtendContextMenu 
   STDMETHOD(AddMenuItems)(LPDATAOBJECT pDataObject, LPCONTEXTMENUCALLBACK pCallbackUnknown, long *pInsertionAllowed);
   STDMETHOD(Command)(long nCommandID, LPDATAOBJECT pDataObject);

// IExtendTaskPad interface members
   STDMETHOD(TaskNotify        )(IDataObject * pdo, VARIANT * pvarg, VARIANT * pvparam);
   STDMETHOD(GetTitle          )(LPOLESTR szGroup, LPOLESTR * szTitle);
   STDMETHOD(GetDescriptiveText)(LPOLESTR szGroup, LPOLESTR * szText);
   STDMETHOD(GetBackground     )(LPOLESTR szGroup, MMC_TASK_DISPLAY_OBJECT * pTDO);
   STDMETHOD(EnumTasks         )(IDataObject * pdo, BSTR szTaskGroup, IEnumTASK** ppEnumTASK);
   STDMETHOD(GetListPadInfo    )(LPOLESTR szGroup, MMC_LISTPAD_INFO * pListPadInfo);

// public
   void SetComponentData (CDsplMgr2 * pComponentData) { m_pComponentData = pComponentData; }
   long GetViewMode ();

private:
   IResultData    * m_pResultData;
   IHeaderCtrl    * m_pHeaderCtrl;
	CDsplMgr2      * m_pComponentData;  // the guy who created me
   UINT             m_IsTaskPad;       // IDM_CUSTOMPAD or IDM_TASKPAD
   LPCONSOLE        m_pConsole;        // from MMC
   long             m_TaskPadCount;
   BOOL             m_toggle;
   BOOL             m_toggleEntry;     // test "Change..." button

private:
   HRESULT OnShow       (LPDATAOBJECT pDataObject, long arg, long param);
   HRESULT OnAddImages  (LPDATAOBJECT pDataObject, long arg, long param);
   HRESULT OnDblClick   (LPDATAOBJECT pDataObject, long arg, long param);
   HRESULT OnViewChange (LPDATAOBJECT pDataObject, long arg, long param);
   HRESULT OnListPad    (LPDATAOBJECT pDataObject, long arg, long param);
   HRESULT OnRestoreView(LPDATAOBJECT pDataObject, long arg, long param);

   void TestConsoleVerb(void);

};

LPOLESTR CoTaskDupString (LPOLESTR szString);
void CoTaskFreeString (LPOLESTR szString);

#endif //__DSPLMGR2_H_