// scribdoc.h : interface of the CScribDoc class
//
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and Microsoft
// QuickHelp and/or WinHelp documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.


class CStroke;

class CScribItem;

class CScribDoc : public COleServerDoc
{
protected: // create from serialization only
	CScribDoc();
	DECLARE_DYNCREATE(CScribDoc)

// Attributes
protected:
	CObList         m_strokeList;   // Each member of the list is a CStroke

	// The document keeps track of the current pen width on behalf of
	// all views. We'd like the user interface of Scribble to be such
	// that if the user chooses the Draw Thick Line command, it will apply
	// to all views, not just the view that currently has the focus.

	UINT            m_nPenWidth;        // current user-selected pen width
	BOOL            m_bThickPen;        // TRUE if current pen is thick
	UINT            m_nThinWidth;
	UINT            m_nThickWidth;
	CPen            m_penCur;           // pen created according to
										// user-selected pen style (width)
public:
	CPen*           GetCurrentPen() { return &m_penCur; }

protected:
	CSize           m_sizeDoc;
public:
	CSize GetDocSize() { return m_sizeDoc; }
	CScribItem* GetEmbeddedItem()
		{ return (CScribItem*)COleServerDoc::GetEmbeddedItem(); }

// Operations
public:
	void DeleteContents();
	CStroke* NewStroke();
	POSITION GetFirstStrokePos();
	CStroke* GetNextStroke(POSITION& pos);

// Implementation
protected:
	void ReplacePen();
	COleServerItem* OnGetEmbeddedItem();
	void OnSetItemRects(LPCRECT lpPosRect, LPCRECT lpClipRect);

public:
	virtual ~CScribDoc();
	virtual void Serialize(CArchive& ar);   // overridden for document i/o
#ifdef _DEBUG
	virtual void AssertValid() const;
	virtual void Dump(CDumpContext& dc) const;
#endif
protected:
	void            InitDocument();
	virtual BOOL    OnNewDocument();
	virtual BOOL    OnOpenDocument(const char* pszPathName);

// Generated message map functions
protected:
	//{{AFX_MSG(CScribDoc)
		// NOTE - the ClassWizard will add and remove member functions here.
		//    DO NOT EDIT what you see in these blocks of generated code !
	afx_msg void OnEditClearAll();
	afx_msg void OnUpdateEditClearAll(CCmdUI* pCmdUI);
	afx_msg void OnPenThickOrThin();
	afx_msg void OnUpdatePenThickOrThin(CCmdUI* pCmdUI);
	afx_msg void OnPenWidths();
	afx_msg void OnEditCopy();
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

/////////////////////////////////////////////////////////////////////////////
// class CStroke
//
// A stroke is a series of connected points in the scribble drawing.
// A scribble document may have multiple strokes.

class CStroke : public CObject
{
public:
	CStroke(UINT nPenWidth);

protected:
	CStroke();
	DECLARE_SERIAL(CStroke)

// Attributes
	UINT                m_nPenWidth;    // one pen width applies to entire stroke
	CDWordArray         m_pointArray;   // series of connected points
	CRect               m_rectBounding; // smallest rect that surrounds all
										// of the points in the stroke
										// measured in MM_LOENGLISH units
										// (0.01 inches, with Y-axis inverted)
public:
	CRect& GetBoundingRect() { return m_rectBounding; }

// Operations
public:
	void AddPoint(CPoint pt);
	BOOL DrawStroke(CDC* pDC);
	void FinishStroke();

// Helper functions
protected:
	CPoint GetPoint(int i) const { return CPoint(m_pointArray[i]); }

public:
	virtual void Serialize(CArchive& ar);
};
