// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
 
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef _PWL_CARET_H_
#define _PWL_CARET_H_

struct PWL_CARET_INFO
{
public:
	PWL_CARET_INFO() : bVisible(FALSE), ptHead(0,0), ptFoot(0,0)
	{		
	}

	FX_BOOL						bVisible;
	CPDF_Point					ptHead;
	CPDF_Point					ptFoot;
};


class CPWL_Caret : public CPWL_Wnd  
{
public:
	CPWL_Caret();
	virtual ~CPWL_Caret();
public:
	virtual CFX_ByteString		GetClassName() const;
	virtual void				GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream);
	virtual void				DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
	virtual void				InvalidateRect(CPDF_Rect * pRect = NULL);

	virtual void				SetVisible(FX_BOOL bVisible) {}

	virtual	void				TimerProc();

	void						SetCaret(FX_BOOL bVisible, const CPDF_Point & ptHead, const CPDF_Point & ptFoot);	
	CFX_ByteString				GetCaretAppearanceStream(const CPDF_Point & ptOffset);

private:
	void						GetCaretApp(CFX_ByteTextBuf & sAppStream,const CPDF_Point & ptOffset);
	CPDF_Rect					GetCaretRect() const;

	FX_BOOL						m_bFlash;
	CPDF_Point					m_ptHead;
	CPDF_Point					m_ptFoot;
	FX_FLOAT					m_fWidth;
	FX_INT32						m_nDelay;

public:
	void						SetInvalidRect(CPDF_Rect rc) {m_rcInvalid = rc;}
private:
	CPDF_Rect					m_rcInvalid;
};

#endif // !defined(AFX_PWL_CARET_H__6A729612_4173_4B65_BCAB_7C6C850ECA47__INCLUDED_)

