/***
*cpoly.h
*
*  Copyright (C) 1992, Microsoft Corporation.  All Rights Reserved.
*  Information Contained Herein Is Proprietary and Confidential.
*
*Purpose:
*  Definition of the CPoly class.
*
*  The CPoly class defines a number of methods and exposes them for
*  external programmability via IDispatch,
*
*  methods:
*    DRAW               - draw the polygon
*    RESET              - delete all points from the polygon
*
*    ADDPOINT(X, Y)     - add a point with coordinates (x,y) to the polygon
*
*    ENUMPOINTS         - return a collection of the polygon's points
*
*    GETXORIGIN         - get and set the X origin of the polygon
*    SETXORIGIN
*
*    GETYORIGIN         - get and set the Y origin of the polygon
*    SETYORIGIN
*
*    GETWIDTH           - get and set the line width of the polygon
*    SETWIDTH
*
*  UNDONE: update description
*
*Implementation Notes:
*
*****************************************************************************/


#ifndef CLASS
# ifdef __TURBOC__
#  define CLASS class huge
# else
#  define CLASS class FAR
# endif
#endif

class CPoint;

CLASS CPoly : public IDispatch
{
public:
	static CPoly FAR* Create();

	/* IUnknown methods */
	STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppvObj);
	STDMETHOD_(unsigned long, AddRef)(void);
	STDMETHOD_(unsigned long, Release)(void);

	/* IDispatch methods */
	STDMETHOD(GetTypeInfoCount)(unsigned int FAR* pcTypeInfo);

	STDMETHOD(GetTypeInfo)(
	  unsigned int iTypeInfo,
	  LCID lcid,
	  ITypeInfo FAR* FAR* ppTypeInfo);

	STDMETHOD(GetIDsOfNames)(
	  REFIID riid,
	  char FAR* FAR* rgszNames,
	  unsigned int cNames,
	  LCID lcid,
	  DISPID FAR* rgdispid);

	STDMETHOD(Invoke)(
	  DISPID dispidMember,
	  REFIID riid,
	  LCID lcid,
	  unsigned short wFlags,
	  DISPPARAMS FAR* pdispparams,
	  VARIANT FAR* pvarResult,
	  EXCEPINFO FAR* pexcepinfo,
	  unsigned int FAR* puArgErr);

	/* Introduced methods */

	virtual void PASCAL Draw(void);
	virtual void PASCAL Reset(void);

	// add a point with the given 'x' and 'y' coordinates
	virtual HRESULT PASCAL AddPoint(short x, short y);

	// return a collection of the polygon's points
	virtual HRESULT PASCAL EnumPoints(IEnumVARIANT FAR* FAR* ppenum);

	// get/set the polygon's X origin property
	virtual short PASCAL GetXOrigin(void);
	virtual void  PASCAL SetXOrigin(short x);

	// get/set the polygon's Y origin property
	virtual short PASCAL GetYOrigin(void);
	virtual void  PASCAL SetYOrigin(short y);

	virtual short PASCAL GetWidth(void);
	virtual void  PASCAL SetWidth(short width);

	virtual short PASCAL get_red(void);
	virtual void  PASCAL set_red(short red);

	virtual short PASCAL get_green(void);
	virtual void  PASCAL set_green(short green);

	virtual short PASCAL get_blue(void);
	virtual void  PASCAL set_blue(short blue);

	// Debug method
	virtual void  PASCAL Dump(void);

public:

	// Draw all polygons.
	static void PolyDraw(void);

	// Release all polygons.
	static void PolyTerm(void);

	// Dump all polygons to dbwin.
	static void PolyDump(void);


private:
	CPoly();

	short m_xorg;
	short m_yorg;
	short m_width;

	short m_red;
	short m_green;
	short m_blue;

	unsigned long m_refs;
	unsigned int m_cPoints;

	POINTLINK FAR* m_ppointlink;
	POINTLINK FAR* m_ppointlinkLast;
};

// DISPIDs for the members and properties available via IDispatch.
//
enum IDMEMBER_CPOLY {
	IDMEMBER_CPOLY_DRAW = 1,
	IDMEMBER_CPOLY_RESET,
	IDMEMBER_CPOLY_ADDPOINT,
	IDMEMBER_CPOLY_ENUMPOINTS,
	IDMEMBER_CPOLY_GETXORIGIN,
	IDMEMBER_CPOLY_SETXORIGIN,
	IDMEMBER_CPOLY_GETYORIGIN,
	IDMEMBER_CPOLY_SETYORIGIN,
	IDMEMBER_CPOLY_GETWIDTH,
	IDMEMBER_CPOLY_SETWIDTH,
	IDMEMBER_CPOLY_GETRED,
	IDMEMBER_CPOLY_SETRED,
	IDMEMBER_CPOLY_GETGREEN,
	IDMEMBER_CPOLY_SETGREEN,
	IDMEMBER_CPOLY_GETBLUE,
	IDMEMBER_CPOLY_SETBLUE,
	IDMEMBER_CPOLY_DUMP,
	IDMEMBER_CPOLY_MAX
};

// structure used to link together polygons
//
struct POLYLINK {
	POLYLINK FAR* next;
	CPoly FAR* ppoly;
};


// The CPoly class factory
//
CLASS CPolyCF : public IClassFactory
{
public:
	static IClassFactory FAR* Create();

	/* IUnknown methods */
	STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppv);
	STDMETHOD_(unsigned long, AddRef)(void);
	STDMETHOD_(unsigned long, Release)(void);

	/* IClassFactory methods */
	STDMETHOD(CreateInstance)(
	  IUnknown FAR* pUnkOuter, REFIID riid, void FAR* FAR* ppv);
#ifdef _MAC
	STDMETHOD(LockServer)(unsigned long fLock);
#else
	STDMETHOD(LockServer)(BOOL fLock);
#endif

private:
	CPolyCF();

	unsigned long m_refs;
};
