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


#ifndef _ADSIEDIT_H
#define _ADSIEDIT_H

#include <stdabout.h>

//////////////////////////////////////////////////////////////////////////////
// global constants and macros

extern const CLSID CLSID_ADSIEditSnapin;    // In-Proc server GUID
extern const CLSID CLSID_ADSIEditAbout;    // In-Proc server GUID
extern const CLSID CLSID_DsAttributeEditor;
extern const CLSID IID_IDsAttributeEditor; 

///////////////////////////////////////////////////////////////////////////////
// RESOURCES

// enumeration for image strips
enum
{
	ROOT_IMAGE = 0,

	SEPARATOR_1,
	
	// 10 (5 regular, 5 test failed) images for server
	SERVER_IMAGE_NOT_LOADED,
	SERVER_IMAGE_LOADING,
	SERVER_IMAGE_LOADED,
	SERVER_IMAGE_UNABLE_TO_LOAD,
	SERVER_IMAGE_ACCESS_DENIED,

	SERVER_IMAGE_NOT_LOADED_TEST_FAIL,
	SERVER_IMAGE_LOADING_TEST_FAIL,
	SERVER_IMAGE_LOADED_TEST_FAIL,
	SERVER_IMAGE_UNABLE_TO_LOAD_TEST_FAIL,
	SERVER_IMAGE_ACCESS_DENIED_TEST_FAIL,

	SEPARATOR_2,

	// 12 (6 primary, 6 secondary) images for zones
	ZONE_IMAGE_1,
	ZONE_IMAGE_LOADING_1,
	ZONE_IMAGE_UNABLE_TO_LOAD_1,
	ZONE_IMAGE_PAUSED_1,
	ZONE_IMAGE_EXPIRED_1,
	ZONE_IMAGE_ACCESS_DENIED_1,

	SEPARATOR_3,

	ZONE_IMAGE_2,
	ZONE_IMAGE_LOADING_2,
	ZONE_IMAGE_UNABLE_TO_LOAD_2,
	ZONE_IMAGE_PAUSED_2,
	ZONE_IMAGE_EXPIRED_2,
	ZONE_IMAGE_ACCESS_DENIED_2,
	
	SEPARATOR_4,
	
	// 4 images for domains
	DOMAIN_IMAGE,
	DOMAIN_IMAGE_UNABLE_TO_LOAD,
	DOMAIN_IMAGE_LOADING,
	DOMAIN_IMAGE_ACCESS_DENIED,
	
	SEPARATOR_5,

	// 4 images for delegated domains
	DELEGATED_DOMAIN_IMAGE,
	DELEGATED_DOMAIN_IMAGE_UNABLE_TO_LOAD,
	DELEGATED_DOMAIN_IMAGE_LOADING,
	DELEGATED_DOMAIN_IMAGE_ACCESS_DENIED,

	SEPARATOR_6,

	// 4 generic images shared by cache, fwd and rev lookup zones
	FOLDER_IMAGE,
	FOLDER_IMAGE_UNABLE_TO_LOAD,
	FOLDER_IMAGE_LOADING,
	FOLDER_IMAGE_ACCESS_DENIED,

	SEPARATOR_7,

	// 1 record image
	RECORD_IMAGE_BASE,
	
	OPEN_FOLDER, // unused
	FOLDER_WITH_HAND
};

////////////////////////////////////////////////////////////////
// aliases for images indexes that share the same icon

#define ZONE_IMAGE_NOT_LOADED_1				ZONE_IMAGE_1
#define ZONE_IMAGE_NOT_LOADED_2				ZONE_IMAGE_2
#define ZONE_IMAGE_LOADED_1					ZONE_IMAGE_1
#define ZONE_IMAGE_LOADED_2					ZONE_IMAGE_2

#define DOMAIN_IMAGE_NOT_LOADED				DOMAIN_IMAGE
#define DOMAIN_IMAGE_LOADED					DOMAIN_IMAGE

#define	DELEGATED_DOMAIN_IMAGE_NOT_LOADED	DELEGATED_DOMAIN_IMAGE
#define	DELEGATED_DOMAIN_IMAGE_LOADED		DELEGATED_DOMAIN_IMAGE

#define FOLDER_IMAGE_NOT_LOADED				FOLDER_IMAGE
#define FOLDER_IMAGE_LOADED					FOLDER_IMAGE

///////////////////////////////////////////////////////////////
// bitmaps and images constants

#define	BMP_COLOR_MASK RGB(255,0,255) // pink


///////////////////////////////////////////////////////////////
// headers for result pane

#define N_HEADER_COLS (3)
#define N_PARTITIONS_HEADER_COLS (4)

#define COLUMNSET_ID_DEFAULT L"--ADSI Edit Column Set--"
#define COLUMNSET_ID_PARTITIONS L"--Partitions Column Set--"
#define N_HEADER_NAME	(0)
#define N_HEADER_TYPE	(1)
#define N_HEADER_DN		(2)

#define N_PARTITIONS_HEADER_NAME	 (0)
#define N_PARTITIONS_HEADER_NCNAME (1)
#define N_PARTITIONS_HEADER_TYPE	 (2)
#define N_PARTITIONS_HEADER_DN		 (3)

typedef struct _ColumnDefinition
{
  PCWSTR            pszColumnID;
  DWORD             dwColumnCount;
  RESULT_HEADERMAP* headers;
} COLUMN_DEFINITION, *PCOLUMN_DEFINITION;

extern PCOLUMN_DEFINITION ColumnDefinitions[];
extern RESULT_HEADERMAP _HeaderStrings[];
extern RESULT_HEADERMAP _PartitionsHeaderStrings[];

///////////////////////////////////////////////////////////////
// context menus

// Identifiers for each of the commands in the context menu.
enum
{
	// items for the root node
	IDM_SNAPIN_ADVANCED_VIEW,
  IDM_SNAPIN_FILTERING,
	IDM_SNAPIN_CONNECT_TO_SERVER,

	// items for the server node
	IDM_SERVER_NEW_ZONE,
	IDM_SERVER_UPDATE_DATA_FILES,
	// items for the zone node
	IDM_ZONE_UPDATE_DATA_FILE,

	// items for the domain node
	IDM_DOMAIN_NEW_RECORD,
	IDM_DOMAIN_NEW_DOMAIN,
	IDM_DOMAIN_NEW_DELEGATION,
	IDM_DOMAIN_NEW_HOST,
	IDM_DOMAIN_NEW_ALIAS,
	IDM_DOMAIN_NEW_MX,
	IDM_DOMAIN_NEW_PTR,
	
	// common items
};


DECLARE_MENU(CADSIEditDataMenuHolder)

//////////////////////////////////////////////////////////////////////////
// CADSIEditColumnSet

class CADSIEditColumnSet : public CColumnSet
{
public :
	CADSIEditColumnSet(PCWSTR pszColumnID)
		: CColumnSet(pszColumnID)
	{
    PCOLUMN_DEFINITION pColumnDef = NULL;
    for (UINT nIdx = 0; ColumnDefinitions[nIdx]; nIdx++)
    {
      pColumnDef = ColumnDefinitions[nIdx];
      if (0 == _wcsicmp(pColumnDef->pszColumnID, pszColumnID))
      {
        break;
      }
    }

    if (pColumnDef)
    {
      for (int iCol = 0; iCol < pColumnDef->dwColumnCount; iCol++)
      {
        CColumn* pNewColumn = new CColumn(pColumnDef->headers[iCol].szBuffer,
                                          pColumnDef->headers[iCol].nFormat,
                                          pColumnDef->headers[iCol].nWidth,
                                          iCol);
        AddTail(pNewColumn);
      }
    }
    else
    {
      //
      // Fall back to adding the default column directly
      // 
		  for (int iCol = 0; iCol < N_HEADER_COLS; iCol++)
		  {
        CColumn* pNewColumn = new CColumn(_HeaderStrings[iCol].szBuffer,
                                          _HeaderStrings[iCol].nFormat,
                                          _HeaderStrings[iCol].nWidth,
                                          iCol);
        AddTail(pNewColumn);
 		  }
    }
	}
};


////////////////////////////////////////////////////////////////////////
// CADSIEditComponentObject (.i.e "view")

class CADSIEditComponentObject : public CComponentObject
{
BEGIN_COM_MAP(CADSIEditComponentObject)
	COM_INTERFACE_ENTRY(IComponent) // have to have at least one static entry, so pick one
	COM_INTERFACE_ENTRY_CHAIN(CComponentObject) // chain to the base class
END_COM_MAP()

DECLARE_NOT_AGGREGATABLE(CADSIEditComponentObject)

protected:
	virtual HRESULT InitializeHeaders(CContainerNode* pContainerNode);
	virtual HRESULT InitializeBitmaps(CTreeNode* cookie);
  virtual HRESULT InitializeToolbar(IToolbar* pToolbar) { return E_NOTIMPL; }
};



////////////////////////////////////////////////////////////////////////
// CADSIEditComponentDataObject (.i.e "document")

class CADSIEditComponentDataObject :
		public CComponentDataObject,
		public CComCoClass<CADSIEditComponentDataObject,&CLSID_ADSIEditSnapin>
{
BEGIN_COM_MAP(CADSIEditComponentDataObject)
	COM_INTERFACE_ENTRY(IComponentData) // have to have at least one static entry, so pick one
	COM_INTERFACE_ENTRY_CHAIN(CComponentDataObject) // chain to the base class
END_COM_MAP()

DECLARE_NOT_AGGREGATABLE(CADSIEditComponentDataObject)

DECLARE_REGISTRY_CLSID()

public:
  CADSIEditComponentDataObject();
  virtual ~CADSIEditComponentDataObject()
  {
    if (m_pColumnSet != NULL)
      delete m_pColumnSet;
  }

	// IComponentData interface members
	STDMETHOD(CreateComponent)(LPCOMPONENT* ppComponent);

  	// IPersistStream interface members
	HRESULT STDMETHODCALLTYPE GetClassID(CLSID __RPC_FAR *pClassID)
	{
		ASSERT(pClassID != NULL);
		memcpy(pClassID, (GUID*)&GetObjectCLSID(), sizeof(CLSID));
		return S_OK;
	}

public:
	static BOOL LoadResources();
private:
	static BOOL FindDialogContextTopic(/*IN*/UINT nDialogID,
                                /*IN*/ HELPINFO* pHelpInfo,
                                /*OUT*/ ULONG* pnContextTopic);

// virtual functions
protected:
	virtual HRESULT OnSetImages(LPIMAGELIST lpScopeImage);
	
	virtual CRootData* OnCreateRootData();

	// help handling
  virtual LPCWSTR GetHTMLHelpFileName();
	virtual void OnNodeContextHelp(CTreeNode* pNode);
public:
	virtual void OnDialogContextHelp(UINT nDialogID, HELPINFO* pHelpInfo);

  // ISnapinHelp interface members
  STDMETHOD(GetHelpTopic)(LPOLESTR* lpCompiledHelpFile);

  CADSIEditColumnSet* GetColumnSet() { return m_pColumnSet; }

  //
  // Allow multiple selection
  //
  virtual BOOL IsMultiSelect() { return TRUE; }

private:
  CADSIEditColumnSet* m_pColumnSet;

};


//////////////////////////////////////////////////////////////////////////
// CADSIEditAbout

class CADSIEditAbout :
	public CSnapinAbout,
	public CComCoClass<CADSIEditAbout, &CLSID_ADSIEditAbout>

{
public:
DECLARE_REGISTRY_CLSID()
	CADSIEditAbout();
};

#endif _ADSIEDIT_H