// 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_COMBOBOX_H_
#define _PWL_COMBOBOX_H_

class CPWL_CBEdit : public CPWL_Edit
{
public:
	CPWL_CBEdit(){};
	virtual ~CPWL_CBEdit(){};
};

class PWL_CLASS CPWL_CBListBox : public CPWL_ListBox
{
public:
	CPWL_CBListBox(){};
	virtual ~CPWL_CBListBox(){};

public:
	virtual FX_BOOL				OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag);

	virtual FX_BOOL				OnKeyDown(FX_WORD nChar, FX_BOOL & bExit, FX_DWORD nFlag);
	virtual FX_BOOL				OnChar(FX_WORD nChar, FX_BOOL & bExit, FX_DWORD nFlag);
};

#define PWL_COMBOBOX_BUTTON_WIDTH		13

class CPWL_CBButton : public CPWL_Wnd
{
public:
	CPWL_CBButton(){};
	virtual ~CPWL_CBButton(){};

public:
	virtual void				GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream);
	virtual void				DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);

	virtual FX_BOOL				OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag);
	virtual FX_BOOL				OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag);

};

class PWL_CLASS CPWL_ComboBox : public CPWL_Wnd  
{
public:
	CPWL_ComboBox();
	operator CPWL_Edit* ()		{return m_pEdit;}

public:
	virtual CFX_ByteString		GetClassName() const;
	virtual void				OnCreate(PWL_CREATEPARAM & cp);

	virtual FX_BOOL				OnKeyDown(FX_WORD nChar, FX_DWORD nFlag);	
	virtual FX_BOOL				OnChar(FX_WORD nChar, FX_DWORD nFlag);

	virtual void				OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam = 0, FX_INTPTR lParam = 0);

	virtual void				CreateChildWnd(const PWL_CREATEPARAM & cp);
	virtual void				RePosChildWnd();

	virtual CPDF_Rect			GetFocusRect() const;
	
	virtual void				SetFocus();
	virtual void				KillFocus();

	FX_BOOL						IsModified() const;

public:	
	void						SetFillerNotify(IPWL_Filler_Notify* pNotify);

	CFX_WideString				GetText() const;
	void						SetText(FX_LPCWSTR text);

	void						AddString(FX_LPCWSTR string);
	FX_INT32					GetSelect() const;
	void						SetSelect(FX_INT32 nItemIndex);

	void						SetEditSel(FX_INT32 nStartChar,FX_INT32 nEndChar);
	void						GetEditSel(FX_INT32 & nStartChar, FX_INT32 & nEndChar ) const;
	void						Clear();
	void						SelectAll();
	FX_BOOL						IsPopup() const;

	void						SetSelectText();

private:	
	void						CreateEdit(const PWL_CREATEPARAM & cp);
	void						CreateButton(const PWL_CREATEPARAM & cp);
	void						CreateListBox(const PWL_CREATEPARAM & cp);

	void						SetPopup(FX_BOOL bPopup);
	
private:
	CPWL_CBEdit*				m_pEdit;
	CPWL_CBButton*				m_pButton;
	CPWL_CBListBox*				m_pList;

	FX_BOOL						m_bPopup;
	CPDF_Rect					m_rcOldWindow;
	FX_INT32					m_nPopupWhere;
	FX_INT32					m_nSelectItem;
	IPWL_Filler_Notify*			m_pFillerNotify;

public:
	void							AttachFFLData(void* pData) {m_pFormFiller = pData;}
private:
	void*							m_pFormFiller;
};

#endif // !defined(AFX_PWL_COMBOBOX_H__9D6645F8_64AA_4806_94E8_95FDEDD39C17__INCLUDED_)

