//
// DRAWOBJ.HPP
// Drawing objects: point, openpolyline, closepolyline, ellipse
//
// Copyright Microsoft 1998-
//
#ifndef __DRAWOBJ_HPP_
#define __DRAWOBJ_HPP_

//
// Maximum number of points in a freehand object
//
#define MAX_FREEHAND_POINTS     65535
#define MAX_POINT_LIST_VALUES   255

BOOL EllipseHit(LPCRECT lpEllipseRect, BOOL bBorderHit, UINT uPenWidth, LPCRECT lpHitRect );
void GetDrawingDestinationAddress(DrawingDestinationAddress *destinationAddress, PUINT workspaceHandle, PUINT planeID);

typedef struct tagCOLOR_PRESENT
{
	BOOL		m_bIsPresent;
	RGBTRIPLE	m_color;
}COLOR;


class DrawObj : public T126Obj
{

public:

	DCDWordArray *	m_points;				// List of consecutive points including anchor point


	DrawObj (UINT drawingType, UINT toolType);
	DrawObj ( DrawingCreatePDU * pdrawingCreatePDU );
	void DrawEditObj ( DrawingEditPDU * pdrawingEditPDU );

	~DrawObj( void );

	void Draw(HDC hDC = NULL, BOOL bForcedDraw = FALSE, BOOL bPrinting = FALSE);
	BOOL PolyLineHit(LPCRECT pRectHit);
	BOOL CheckReallyHit(LPCRECT pRectHit);

	//
	// PDU stuff
	//
	void CreateDrawingCreatePDU(DrawingCreatePDU *);
	void CreateDrawingEditPDU(DrawingEditPDU *);
	void CreateDrawingDeletePDU(DrawingDeletePDU*);
	void SetDrawingAttrib(PDrawingCreatePDU_attributes *attributes);
	void AllocateAttrib(PDrawingCreatePDU_attributes *pattributes);


	//
	// Get/Set drawing type
	//
	void SetDrawingType(UINT type){m_drawingType = type;};
	UINT GetDrawingType(void) {return m_drawingType;}

    //
    // Get/set the pen style
    //
    void SetLineStyle(UINT lineStyle){m_lineStyle = lineStyle;	ChangedLineStyle();};
    UINT  GetLineStyle(void) { return m_lineStyle;}


	//
	// Get/set pen Color
	//
    void SetPenColor(COLORREF rgb, BOOL isPresent);
    BOOL GetPenColor(COLORREF * rgb);
	BOOL GetPenColor(RGBTRIPLE* rgb);

	//
	// Get/set fill Color
	//
	BOOL HasFillColor(void){return m_bIsFillColorPresent;}
    void SetFillColor(COLORREF rgb, BOOL isPresent);
    BOOL GetFillColor(COLORREF * rgb);
	BOOL GetFillColor(RGBTRIPLE* rgb);

	//
	//
	// Get/set pen nib
	//
    void SetPenNib(UINT nib){m_penNib = nib;ChangedPenNib();};
    UINT GetPenNib(void){return m_penNib;}

	//
	// Get/set highlight
	//
    void SetHighlight(BOOL bHighlight){m_bHighlight = bHighlight; ChangedHighlight();};
    BOOL GetHighlight(void){return m_bHighlight;}


	BOOL AddPoint(POINT point);
	void AddPointToBounds(int x, int y);


	// JOSEF add functionality
	void SetEnd(POINT){};
	void UnDraw(void);
    void SetViewHandle(UINT viewHandle){};

	//
	// Get/set flag telling that this drawing is completed
	//
	void SetIsCompleted(BOOL isCompleted) {m_isDrawingCompleted = isCompleted;}
	BOOL GetIsCompleted(void){return m_isDrawingCompleted;}

	//
	// Get the UI tool from a drawing pdu
	//
	void SetUIToolType(void);

	//
	// Mask 0x000008FF (penColor_chosen = 1... DrawingAttribute_zOrder_chosen = 8)
	//
	void ChangedPenColor(void){m_dwChangedAttrib |=
					(1 << (penColor_chosen-1)) | (DrawingEditPDU_attributeEdits_present << 4);}
	void ChangedFillColor(void){m_dwChangedAttrib |=
					(1 << (fillColor_chosen-1))  | (DrawingEditPDU_attributeEdits_present << 4);}
	void ChangedPenThickness(void){m_dwChangedAttrib |=
					(1 << (penThickness_chosen-1))  | (DrawingEditPDU_attributeEdits_present << 4);}
	void ChangedPenNib(void){m_dwChangedAttrib |=
					(1 << (penNib_chosen-1))  | (DrawingEditPDU_attributeEdits_present << 4);}
	void ChangedLineStyle(void){m_dwChangedAttrib |=
					(1 << (lineStyle_chosen-1))  | (DrawingEditPDU_attributeEdits_present << 4);}
	void ChangedHighlight(void){m_dwChangedAttrib |=
					(1 << (highlight_chosen-1))  | (DrawingEditPDU_attributeEdits_present << 4);}
	void ChangedViewState(void){m_dwChangedAttrib |=
					(1 << (DrawingAttribute_viewState_chosen-1))  | (DrawingEditPDU_attributeEdits_present << 4);}
	void ChangedZOrder(void){m_dwChangedAttrib |=
					(1 << (DrawingAttribute_zOrder_chosen-1))  | (DrawingEditPDU_attributeEdits_present << 4);}

	BOOL HasPenColorChanged(void){return (m_dwChangedAttrib & (1 << (penColor_chosen - 1)));}
	BOOL HasFillColorChanged(void){return (m_dwChangedAttrib & (1 << (fillColor_chosen - 1)));}
	BOOL HasPenThicknessChanged(void){return (m_dwChangedAttrib & (1 << (penThickness_chosen - 1)));}
	BOOL HasPenNibChanged(void){return (m_dwChangedAttrib & (1 << (penNib_chosen - 1)));}
	BOOL HasLineStyleChanged(void){return (m_dwChangedAttrib & (1 << (lineStyle_chosen - 1)));}
	BOOL HasHighlightChanged(void){return (m_dwChangedAttrib & (1 << (highlight_chosen - 1)));}
	BOOL HasViewStateChanged(void){return (m_dwChangedAttrib & (1 << (DrawingAttribute_viewState_chosen - 1)));}
	BOOL HasZOrderChanged(void){return (m_dwChangedAttrib & (1 << (DrawingAttribute_zOrder_chosen - 1)));}


	//
	// Mask 0x000000700 bits (pointListEdits_present = 0x10... DrawingEditPDU_anchorPointEdit_present = 0x40)
	//
	void ChangedPointList(void) { m_dwChangedAttrib |= pointListEdits_present << 4;}
	void ChangedRotation(void) { m_dwChangedAttrib |= rotationEdit_present << 4;}
	void ChangedAnchorPoint(void) { m_dwChangedAttrib |= DrawingEditPDU_anchorPointEdit_present << 4;}

	BOOL HasPointListChanged(void) { return (m_dwChangedAttrib & pointListEdits_present << 4);}
	BOOL HasRotationChanged(void) { return (m_dwChangedAttrib & rotationEdit_present << 4);}
	BOOL HasAnchorPointChanged(void) { return (m_dwChangedAttrib & DrawingEditPDU_anchorPointEdit_present << 4);}
	DWORD GetPresentAttribs(void){return ((m_dwChangedAttrib & 0x0F00)>> 4);}
	void ResetAttrib(void){m_dwChangedAttrib = 0;}
	void SetAllAttribs(void){m_dwChangedAttrib = 0x08FF;}


	void	OnObjectEdit(void);
	void	OnObjectDelete(void);
	void	SendNewObjectToT126Apps(void);
	void	GetEncodedCreatePDU(ASN1_BUF *pBuf);

		
protected:

		//
		// T126 Drawing and UI specific
		//
		DWORD		m_dwChangedAttrib;
		UINT		m_drawingType;
		UINT 		m_lineStyle;
		BOOL		m_bIsPenColorPresent;
		BOOL		m_bIsFillColorPresent;
		RGBTRIPLE	m_penColor;
		RGBTRIPLE	m_fillColor;
		UINT		m_penNib;
		BOOL		m_bHighlight;
		BOOL		m_isDrawingCompleted;



UINT  GetSubsequentPoints(UINT choice, POINT * initialPoint, PointList * pointList);
void  GetDrawingAttrib(PVOID pAttribPDU);


};

#endif // __DRAWOBJ_HPP_