// 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 FPDFSDK_INCLUDE_FX_SYSTEMHANDLER_H_
#define FPDFSDK_INCLUDE_FX_SYSTEMHANDLER_H_

typedef void*				FX_HWND;
typedef void*				FX_HMENU;
typedef void					(*TimerCallback)(int32_t idEvent);

typedef struct _FX_SYSTEMTIME
{
    _FX_SYSTEMTIME()
      : wYear(0),
        wMonth(0),
        wDayOfWeek(0),
        wDay(0),
        wHour(0),
        wMinute(0),
        wSecond(0),
        wMilliseconds(0) {}
    FX_WORD wYear;
    FX_WORD wMonth;
    FX_WORD wDayOfWeek;
    FX_WORD wDay;
    FX_WORD wHour;
    FX_WORD wMinute;
    FX_WORD wSecond;
    FX_WORD wMilliseconds;
}FX_SYSTEMTIME;

//cursor style
#define FXCT_ARROW				0
#define FXCT_NESW				1
#define FXCT_NWSE				2
#define FXCT_VBEAM				3
#define FXCT_HBEAM				4
#define FXCT_HAND				5

class IFX_SystemHandler
{
public:
	virtual ~IFX_SystemHandler() {}
	virtual void				InvalidateRect(FX_HWND hWnd, FX_RECT rect) = 0;
    virtual void				OutputSelectedRect(void* pFormFiller, CPDF_Rect&rect) = 0;

	virtual FX_BOOL				IsSelectionImplemented() = 0;

	virtual CFX_WideString		GetClipboardText(FX_HWND hWnd) = 0;
	virtual FX_BOOL				SetClipboardText(FX_HWND hWnd, CFX_WideString string) = 0;

	virtual void				ClientToScreen(FX_HWND hWnd, int32_t& x, int32_t& y) = 0;
	virtual void				ScreenToClient(FX_HWND hWnd, int32_t& x, int32_t& y) = 0;

	/*cursor style
	FXCT_ARROW
	FXCT_NESW
	FXCT_NWSE
	FXCT_VBEAM
	FXCT_HBEAM
	FXCT_HAND
	*/
	virtual void				SetCursor(int32_t nCursorType) = 0;

	virtual FX_HMENU			CreatePopupMenu() = 0;
	virtual FX_BOOL				AppendMenuItem(FX_HMENU hMenu, int32_t nIDNewItem, CFX_WideString string) = 0;
	virtual FX_BOOL				EnableMenuItem(FX_HMENU hMenu, int32_t nIDItem, FX_BOOL bEnabled) = 0;
	virtual int32_t			TrackPopupMenu(FX_HMENU hMenu, int32_t x, int32_t y, FX_HWND hParent) = 0;
	virtual void				DestroyMenu(FX_HMENU hMenu) = 0;

	virtual CFX_ByteString		GetNativeTrueTypeFont(int32_t nCharset) = 0;
	virtual FX_BOOL				FindNativeTrueTypeFont(int32_t nCharset, CFX_ByteString sFontFaceName) = 0;
	virtual CPDF_Font*			AddNativeTrueTypeFontToPDF(CPDF_Document* pDoc, CFX_ByteString sFontFaceName, uint8_t nCharset) = 0;

	virtual int32_t			SetTimer(int32_t uElapse, TimerCallback lpTimerFunc) = 0;
	virtual void				KillTimer(int32_t nID) = 0;


	virtual FX_BOOL				IsSHIFTKeyDown(FX_DWORD nFlag) = 0;
	virtual FX_BOOL				IsCTRLKeyDown(FX_DWORD nFlag) = 0;
	virtual FX_BOOL				IsALTKeyDown(FX_DWORD nFlag) = 0;
	virtual FX_BOOL				IsINSERTKeyDown(FX_DWORD nFlag) = 0;

	virtual	FX_SYSTEMTIME		GetLocalTime() = 0;

	virtual int32_t			GetCharSet() = 0;
	virtual void 				SetCharSet(int32_t nCharSet) = 0;
};

#endif  // FPDFSDK_INCLUDE_FX_SYSTEMHANDLER_H_
