// 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_

#include "core/include/fxcrt/fx_coordinates.h"
#include "core/include/fxcrt/fx_system.h"

class CPDF_Document;
class CPDF_Font;

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

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;
};

// 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, CFX_FloatRect& rect) = 0;

  virtual FX_BOOL IsSelectionImplemented() = 0;

  virtual CFX_WideString GetClipboardText(FX_HWND hWnd) = 0;
  virtual FX_BOOL SetClipboardText(FX_HWND hWnd, CFX_WideString str) = 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 str) = 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_
