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

// clang-format off
// NOLINTNEXTLINE(build/include)
#include "fpdfview.h"

// These values are return values for a public API, so should not be changed
// other than the count when adding new values.
#define FORMTYPE_NONE 0            // Document contains no forms
#define FORMTYPE_ACRO_FORM 1       // Forms are specified using AcroForm spec
#define FORMTYPE_XFA_FULL 2        // Forms are specified using entire XFA spec
#define FORMTYPE_XFA_FOREGROUND 3  // Forms are specified using the XFAF subset
                                   // of XFA spec
#define FORMTYPE_COUNT 4           // The number of form types

#define JSPLATFORM_ALERT_BUTTON_OK 0           // OK button
#define JSPLATFORM_ALERT_BUTTON_OKCANCEL 1     // OK & Cancel buttons
#define JSPLATFORM_ALERT_BUTTON_YESNO 2        // Yes & No buttons
#define JSPLATFORM_ALERT_BUTTON_YESNOCANCEL 3  // Yes, No & Cancel buttons
#define JSPLATFORM_ALERT_BUTTON_DEFAULT JSPLATFORM_ALERT_BUTTON_OK

#define JSPLATFORM_ALERT_ICON_ERROR 0     // Error
#define JSPLATFORM_ALERT_ICON_WARNING 1   // Warning
#define JSPLATFORM_ALERT_ICON_QUESTION 2  // Question
#define JSPLATFORM_ALERT_ICON_STATUS 3    // Status
#define JSPLATFORM_ALERT_ICON_ASTERISK 4  // Asterisk
#define JSPLATFORM_ALERT_ICON_DEFAULT JSPLATFORM_ALERT_ICON_ERROR

#define JSPLATFORM_ALERT_RETURN_OK 1      // OK
#define JSPLATFORM_ALERT_RETURN_CANCEL 2  // Cancel
#define JSPLATFORM_ALERT_RETURN_NO 3      // No
#define JSPLATFORM_ALERT_RETURN_YES 4     // Yes

#define JSPLATFORM_BEEP_ERROR 0           // Error
#define JSPLATFORM_BEEP_WARNING 1         // Warning
#define JSPLATFORM_BEEP_QUESTION 2        // Question
#define JSPLATFORM_BEEP_STATUS 3          // Status
#define JSPLATFORM_BEEP_DEFAULT 4         // Default

// Exported Functions
#ifdef __cplusplus
extern "C" {
#endif

typedef struct _IPDF_JsPlatform {
  /*
   * Version number of the interface. Currently must be 2.
   */
  int version;

  /* Version 1. */

  /*
   * Method: app_alert
   *       Pop up a dialog to show warning or hint.
   * Interface Version:
   *       1
   * Implementation Required:
   *       yes
   * Parameters:
   *       pThis       -   Pointer to the interface structure itself.
   *       Msg         -   A string containing the message to be displayed.
   *       Title       -   The title of the dialog.
   *       Type        -   The type of button group, one of the
   *                       JSPLATFORM_ALERT_BUTTON_* values above.
   *       nIcon       -   The type of the icon, one of the
   *                       JSPLATFORM_ALERT_ICON_* above.
   * Return Value:
   *       Option selected by user in dialogue, one of the
   *       JSPLATFORM_ALERT_RETURN_* values above.
   */
  int (*app_alert)(struct _IPDF_JsPlatform* pThis,
                   FPDF_WIDESTRING Msg,
                   FPDF_WIDESTRING Title,
                   int Type,
                   int Icon);

  /*
   * Method: app_beep
   *       Causes the system to play a sound.
   * Interface Version:
   *       1
   * Implementation Required:
   *       yes
   * Parameters:
   *       pThis       -   Pointer to the interface structure itself
   *       nType       -   The sound type, see JSPLATFORM_BEEP_TYPE_*
   *                       above.
   * Return Value:
   *       None
   */
  void (*app_beep)(struct _IPDF_JsPlatform* pThis, int nType);

  /*
   * Method: app_response
   *       Displays a dialog box containing a question and an entry field for
   *       the user to reply to the question.
   * Interface Version:
   *       1
   * Implementation Required:
   *       yes
   * Parameters:
   *       pThis       -   Pointer to the interface structure itself
   *       Question    -   The question to be posed to the user.
   *       Title       -   The title of the dialog box.
   *       Default     -   A default value for the answer to the question. If
   *                       not specified, no default value is presented.
   *       cLabel      -   A short string to appear in front of and on the
   *                       same line as the edit text field.
   *       bPassword   -   If true, indicates that the user's response should
   *                       be shown as asterisks (*) or bullets (?) to mask
   *                       the response, which might be sensitive information.
   *       response    -   A string buffer allocated by PDFium, to receive the
   *                       user's response.
   *       length      -   The length of the buffer in bytes. Currently, it is
   *                       always 2048.
   * Return Value:
   *       Number of bytes the complete user input would actually require, not
   *       including trailing zeros, regardless of the value of the length
   *       parameter or the presence of the response buffer.
   * Comments:
   *       No matter on what platform, the response buffer should be always
   *       written using UTF-16LE encoding. If a response buffer is
   *       present and the size of the user input exceeds the capacity of the
   *       buffer as specified by the length parameter, only the
   *       first "length" bytes of the user input are to be written to the
   *       buffer.
   */
  int (*app_response)(struct _IPDF_JsPlatform* pThis,
                      FPDF_WIDESTRING Question,
                      FPDF_WIDESTRING Title,
                      FPDF_WIDESTRING Default,
                      FPDF_WIDESTRING cLabel,
                      FPDF_BOOL bPassword,
                      void* response,
                      int length);

  /*
   * Method: Doc_getFilePath
   *       Get the file path of the current document.
   * Interface Version:
   *       1
   * Implementation Required:
   *       yes
   * Parameters:
   *       pThis       -   Pointer to the interface structure itself
   *       filePath    -   The string buffer to receive the file path. Can
   *                       be NULL.
   *       length      -   The length of the buffer, number of bytes. Can
   *                       be 0.
   * Return Value:
   *       Number of bytes the filePath consumes, including trailing zeros.
   * Comments:
   *       The filePath should always be provided in the local encoding.
   *       The return value always indicated number of bytes required for
   *       the buffer, even when there is no buffer specified, or the buffer
   *       size is less than required. In this case, the buffer will not
   *       be modified.
   */
  int (*Doc_getFilePath)(struct _IPDF_JsPlatform* pThis,
                         void* filePath,
                         int length);

  /*
   * Method: Doc_mail
   *       Mails the data buffer as an attachment to all recipients, with or
   *       without user interaction.
   * Interface Version:
   *       1
   * Implementation Required:
   *       yes
   * Parameters:
   *       pThis       -   Pointer to the interface structure itself
   *       mailData    -   Pointer to the data buffer to be sent. Can be NULL.
   *       length      -   The size,in bytes, of the buffer pointed by
   *                       mailData parameter. Can be 0.
   *       bUI         -   If true, the rest of the parameters are used in a
   *                       compose-new-message window that is displayed to the
   *                       user. If false, the cTo parameter is required and
   *                       all others are optional.
   *       To          -   A semicolon-delimited list of recipients for the
   *                       message.
   *       Subject     -   The subject of the message. The length limit is
   *                       64 KB.
   *       CC          -   A semicolon-delimited list of CC recipients for
   *                       the message.
   *       BCC         -   A semicolon-delimited list of BCC recipients for
   *                       the message.
   *       Msg         -   The content of the message. The length limit is
   *                       64 KB.
   * Return Value:
   *       None.
   * Comments:
   *       If the parameter mailData is NULL or length is 0, the current
   *       document will be mailed as an attachment to all recipients.
   */
  void (*Doc_mail)(struct _IPDF_JsPlatform* pThis,
                   void* mailData,
                   int length,
                   FPDF_BOOL bUI,
                   FPDF_WIDESTRING To,
                   FPDF_WIDESTRING Subject,
                   FPDF_WIDESTRING CC,
                   FPDF_WIDESTRING BCC,
                   FPDF_WIDESTRING Msg);

  /*
   * Method: Doc_print
   *       Prints all or a specific number of pages of the document.
   * Interface Version:
   *       1
   * Implementation Required:
   *       yes
   * Parameters:
   *       pThis         -   Pointer to the interface structure itself.
   *       bUI           -   If true, will cause a UI to be presented to the
   *                         user to obtain printing information and confirm
   *                         the action.
   *       nStart        -   A 0-based index that defines the start of an
   *                         inclusive range of pages.
   *       nEnd          -   A 0-based index that defines the end of an
   *                         inclusive page range.
   *       bSilent       -   If true, suppresses the cancel dialog box while
   *                         the document is printing. The default is false.
   *       bShrinkToFit  -   If true, the page is shrunk (if necessary) to
   *                         fit within the imageable area of the printed page.
   *       bPrintAsImage -   If true, print pages as an image.
   *       bReverse      -   If true, print from nEnd to nStart.
   *       bAnnotations  -   If true (the default), annotations are
   *                         printed.
   * Return Value:
   *       None.
   */
  void (*Doc_print)(struct _IPDF_JsPlatform* pThis,
                    FPDF_BOOL bUI,
                    int nStart,
                    int nEnd,
                    FPDF_BOOL bSilent,
                    FPDF_BOOL bShrinkToFit,
                    FPDF_BOOL bPrintAsImage,
                    FPDF_BOOL bReverse,
                    FPDF_BOOL bAnnotations);

  /*
   * Method: Doc_submitForm
   *       Send the form data to a specified URL.
   * Interface Version:
   *       1
   * Implementation Required:
   *       yes
   * Parameters:
   *       pThis       -   Pointer to the interface structure itself
   *       formData    -   Pointer to the data buffer to be sent.
   *       length      -   The size,in bytes, of the buffer pointed by
   *                       formData parameter.
   *       URL         -   The URL to send to.
   * Return Value:
   *       None.
   */
  void (*Doc_submitForm)(struct _IPDF_JsPlatform* pThis,
                         void* formData,
                         int length,
                         FPDF_WIDESTRING URL);

  /*
   * Method: Doc_gotoPage
   *       Jump to a specified page.
   * Interface Version:
   *       1
   * Implementation Required:
   *       yes
   * Parameters:
   *       pThis       -   Pointer to the interface structure itself
   *       nPageNum    -   The specified page number, zero for the first page.
   * Return Value:
   *       None.
   *
   */
  void (*Doc_gotoPage)(struct _IPDF_JsPlatform* pThis, int nPageNum);

  /*
   * Method: Field_browse
   *       Show a file selection dialog, and return the selected file path.
   * Interface Version:
   *       1
   * Implementation Required:
   *       yes
   * Parameters:
   *       pThis       -   Pointer to the interface structure itself.
   *       filePath    -   Pointer to the data buffer to receive the file
   *                       path. Can be NULL.
   *       length      -   The length of the buffer, in bytes. Can be 0.
   * Return Value:
   *       Number of bytes the filePath consumes, including trailing zeros.
   * Comments:
   *       The filePath shoule always be provided in local encoding.
   */
  int (*Field_browse)(struct _IPDF_JsPlatform* pThis,
                      void* filePath,
                      int length);

  /*
   * Pointer to FPDF_FORMFILLINFO interface.
   */
  void* m_pFormfillinfo;

  /* Version 2. */

  void* m_isolate;               /* Unused in v3, retain for compatibility. */
  unsigned int m_v8EmbedderSlot; /* Unused in v3, retain for compatibility. */

  /* Version 3. */
  /* Version 3 moves m_Isolate and m_v8EmbedderSlot to FPDF_LIBRARY_CONFIG. */
} IPDF_JSPLATFORM;

// Flags for Cursor type
#define FXCT_ARROW 0
#define FXCT_NESW 1
#define FXCT_NWSE 2
#define FXCT_VBEAM 3
#define FXCT_HBEAM 4
#define FXCT_HAND 5

/*
 * Function signature for the callback function passed to the FFI_SetTimer
 * method.
 * Parameters:
 *          idEvent     -   Identifier of the timer.
 * Return value:
 *          None.
 */
typedef void (*TimerCallback)(int idEvent);

/*
 * Declares of a struct type to the local system time.
 */
typedef struct _FPDF_SYSTEMTIME {
  unsigned short wYear;         /* years since 1900 */
  unsigned short wMonth;        /* months since January - [0,11] */
  unsigned short wDayOfWeek;    /* days since Sunday - [0,6] */
  unsigned short wDay;          /* day of the month - [1,31] */
  unsigned short wHour;         /* hours since midnight - [0,23] */
  unsigned short wMinute;       /* minutes after the hour - [0,59] */
  unsigned short wSecond;       /* seconds after the minute - [0,59] */
  unsigned short wMilliseconds; /* milliseconds after the second - [0,999] */
} FPDF_SYSTEMTIME;

#ifdef PDF_ENABLE_XFA

// Pageview event flags
#define FXFA_PAGEVIEWEVENT_POSTADDED 1    // After a new pageview is added.
#define FXFA_PAGEVIEWEVENT_POSTREMOVED 3  // After a pageview is removed.

// Definitions for Right Context Menu Features Of XFA Fields
#define FXFA_MENU_COPY 1
#define FXFA_MENU_CUT 2
#define FXFA_MENU_SELECTALL 4
#define FXFA_MENU_UNDO 8
#define FXFA_MENU_REDO 16
#define FXFA_MENU_PASTE 32

// Definitions for File Type.
#define FXFA_SAVEAS_XML 1
#define FXFA_SAVEAS_XDP 2

#endif  // PDF_ENABLE_XFA

typedef struct _FPDF_FORMFILLINFO {
  /*
   * Version number of the interface. Currently must be 1 (when PDFium is built
   *  without the XFA module) or must be 2 (when built with the XFA module).
   */
  int version;

  /* Version 1. */
  /*
   * Method: Release
   *       Give the implementation a chance to release any resources after the
   *       interface is no longer used.
   * Interface Version:
   *       1
   * Implementation Required:
   *       No
   * Comments:
   *       Called by PDFium during the final cleanup process.
   * Parameters:
   *       pThis       -   Pointer to the interface structure itself
   * Return Value:
   *       None
   */
  void (*Release)(struct _FPDF_FORMFILLINFO* pThis);

  /*
   * Method: FFI_Invalidate
   *       Invalidate the client area within the specified rectangle.
   * Interface Version:
   *       1
   * Implementation Required:
   *       yes
   * Parameters:
   *       pThis       -   Pointer to the interface structure itself.
   *       page        -   Handle to the page. Returned by FPDF_LoadPage().
   *       left        -   Left position of the client area in PDF page
   *                       coordinates.
   *       top         -   Top position of the client area in PDF page
   *                       coordinates.
   *       right       -   Right position of the client area in PDF page
   *                       coordinates.
   *       bottom      -   Bottom position of the client area in PDF page
   *                       coordinates.
   * Return Value:
   *       None.
   * Comments:
   *       All positions are measured in PDF "user space".
   *       Implementation should call FPDF_RenderPageBitmap() for repainting
   *       the specified page area.
   */
  void (*FFI_Invalidate)(struct _FPDF_FORMFILLINFO* pThis,
                         FPDF_PAGE page,
                         double left,
                         double top,
                         double right,
                         double bottom);

  /*
   * Method: FFI_OutputSelectedRect
   *       When the user selects text in form fields with the mouse, this
   *       callback function will be invoked with the selected areas.
   * Interface Version:
   *       1
   * Implementation Required:
   *       No
   * Parameters:
   *       pThis       -   Pointer to the interface structure itself.
   *       page        -   Handle to the page. Returned by FPDF_LoadPage()/
   *       left        -   Left position of the client area in PDF page
   *                       coordinates.
   *       top         -   Top position of the client area in PDF page
   *                       coordinates.
   *       right       -   Right position of the client area in PDF page
   *                       coordinates.
   *       bottom      -   Bottom position of the client area in PDF page
   *                       coordinates.
   * Return Value:
   *       None.
   * Comments:
   *       This callback function is useful for implementing special text
   *       selection effects. An implementation should first record the
   *       returned rectangles, then draw them one by one during the next
   *       painting period. Lastly, it should remove all the recorded
   *       rectangles when finished painting.
   */
  void (*FFI_OutputSelectedRect)(struct _FPDF_FORMFILLINFO* pThis,
                                 FPDF_PAGE page,
                                 double left,
                                 double top,
                                 double right,
                                 double bottom);

  /*
   * Method: FFI_SetCursor
   *       Set the Cursor shape.
   * Interface Version:
   *       1
   * Implementation Required:
   *       yes
   * Parameters:
   *       pThis       -   Pointer to the interface structure itself.
   *       nCursorType -   Cursor type, see Flags for Cursor type for details.
   * Return value:
   *       None.
   */
  void (*FFI_SetCursor)(struct _FPDF_FORMFILLINFO* pThis, int nCursorType);

  /*
   * Method: FFI_SetTimer
   *       This method installs a system timer. An interval value is specified,
   *       and every time that interval elapses, the system must call into the
   *       callback function with the timer ID as returned by this function.
   * Interface Version:
   *       1
   * Implementation Required:
   *       yes
   * Parameters:
   *       pThis       -   Pointer to the interface structure itself.
   *       uElapse     -   Specifies the time-out value, in milliseconds.
   *       lpTimerFunc -   A pointer to the callback function-TimerCallback.
   * Return value:
   *       The timer identifier of the new timer if the function is successful.
   *       An application passes this value to the FFI_KillTimer method to kill
   *       the timer. Nonzero if it is successful; otherwise, it is zero.
   */
  int (*FFI_SetTimer)(struct _FPDF_FORMFILLINFO* pThis,
                      int uElapse,
                      TimerCallback lpTimerFunc);

  /*
   * Method: FFI_KillTimer
   *       This method uninstalls a system timer, as set by an earlier call to
   *       FFI_SetTimer.
   * Interface Version:
   *       1
   * Implementation Required:
   *       yes
   * Parameters:
   *       pThis       -   Pointer to the interface structure itself.
   *       nTimerID    -   The timer ID returned by FFI_SetTimer function.
   * Return value:
   *       None.
   */
  void (*FFI_KillTimer)(struct _FPDF_FORMFILLINFO* pThis, int nTimerID);

  /*
   * Method: FFI_GetLocalTime
   *       This method receives the current local time on the system.
   * Interface Version:
   *       1
   * Implementation Required:
   *       yes
   * Parameters:
   *       pThis       -   Pointer to the interface structure itself.
   * Return value:
   *       The local time. See FPDF_SYSTEMTIME above for details.
   * Note: Unused.
   */
  FPDF_SYSTEMTIME (*FFI_GetLocalTime)(struct _FPDF_FORMFILLINFO* pThis);

  /*
   * Method: FFI_OnChange
   *       This method will be invoked to notify the implementation when the
   *       value of any FormField on the document had been changed.
   * Interface Version:
   *       1
   * Implementation Required:
   *       no
   * Parameters:
   *       pThis       -   Pointer to the interface structure itself.
   * Return value:
   *       None.
   */
  void (*FFI_OnChange)(struct _FPDF_FORMFILLINFO* pThis);

  /*
   * Method: FFI_GetPage
   *       This method receives the page handle associated with a specified
   *       page index.
   * Interface Version:
   *       1
   * Implementation Required:
   *       yes
   * Parameters:
   *       pThis       -   Pointer to the interface structure itself.
   *       document    -   Handle to document. Returned by FPDF_LoadDocument().
   *       nPageIndex  -   Index number of the page. 0 for the first page.
   * Return value:
   *       Handle to the page, as previously returned to the implementation by
   *       FPDF_LoadPage().
   * Comments:
   *       The implementation is expected to keep track of the page handles it
   *       receives from PDFium, and their mappings to page numbers. In some
   *       cases, the document-level JavaScript action may refer to a page
   *       which hadn't been loaded yet. To successfully run the Javascript
   *       action, the implementation needs to load the page.
   */
  FPDF_PAGE (*FFI_GetPage)(struct _FPDF_FORMFILLINFO* pThis,
                             FPDF_DOCUMENT document,
                             int nPageIndex);

  /*
   * Method: FFI_GetCurrentPage
   *       This method receives the handle to the current page.
   * Interface Version:
   *       1
   * Implementation Required:
   *       yes
   * Parameters:
   *       pThis       -   Pointer to the interface structure itself.
   *       document    -   Handle to document. Returned by FPDF_LoadDocument().
   * Return value:
   *       Handle to the page. Returned by FPDF_LoadPage().
   * Comments:
   *       The implementation is expected to keep track of the current page,
   *       e.g. the current page can be the one that is most visible on screen.
   */
  FPDF_PAGE (*FFI_GetCurrentPage)(struct _FPDF_FORMFILLINFO* pThis,
                                    FPDF_DOCUMENT document);

  /*
   * Method: FFI_GetRotation
   *       This method receives currently rotation of the page view.
   * Interface Version:
   *       1
   * Implementation Required:
   *       yes
   * Parameters:
   *       pThis       -   Pointer to the interface structure itself.
   *       page        -   Handle to page, as returned by FPDF_LoadPage().
   * Return value:
   *       A number to indicate the page rotation in 90 degree increments
   *       in a clockwise direction:
   *         0 - 0 degrees
   *         1 - 90 degrees
   *         2 - 180 degrees
   *         3 - 270 degrees
   * Note: Unused.
   */
  int (*FFI_GetRotation)(struct _FPDF_FORMFILLINFO* pThis, FPDF_PAGE page);

  /*
   * Method: FFI_ExecuteNamedAction
   *       This method will execute a named action.
   * Interface Version:
   *       1
   * Implementation Required:
   *       yes
   * Parameters:
   *       pThis           -   Pointer to the interface structure itself.
   *       namedAction     -   A byte string which indicates the named action,
   *                           terminated by 0.
   * Return value:
   *       None.
   * Comments:
   *       See the named actions description of <<PDF Reference, version 1.7>>
   *       for more details.
   */
  void (*FFI_ExecuteNamedAction)(struct _FPDF_FORMFILLINFO* pThis,
                                 FPDF_BYTESTRING namedAction);
  /*
   * Method: FFI_SetTextFieldFocus
   *       Called when a text field is getting or losing focus.
   * Interface Version:
   *       1
   * Implementation Required:
   *       no
   * Parameters:
   *       pThis           -   Pointer to the interface structure itself.
   *       value           -   The string value of the form field, in UTF-16LE
   *                           format.
   *       valueLen        -   The length of the string value. This is the
   *                           number of characters, not bytes.
   *       is_focus        -   True if the form field is getting focus, false
   *                           if the form field is losing focus.
   * Return value:
   *       None.
   * Comments:
   *       Only supports text fields and combobox fields.
   */
  void (*FFI_SetTextFieldFocus)(struct _FPDF_FORMFILLINFO* pThis,
                                FPDF_WIDESTRING value,
                                FPDF_DWORD valueLen,
                                FPDF_BOOL is_focus);

  /*
   * Method: FFI_DoURIAction
   *       Ask the implementation to navigate to a uniform resource identifier.
   * Interface Version:
   *       1
   * Implementation Required:
   *       No
   * Parameters:
   *       pThis           -   Pointer to the interface structure itself.
   *       bsURI           -   A byte string which indicates the uniform
   *                           resource identifier, terminated by 0.
   * Return value:
   *       None.
   * Comments:
   *       See the URI actions description of <<PDF Reference, version 1.7>>
   *       for more details.
   */
  void (*FFI_DoURIAction)(struct _FPDF_FORMFILLINFO* pThis,
                          FPDF_BYTESTRING bsURI);

  /*
   * Method: FFI_DoGoToAction
   *       This action changes the view to a specified destination.
   * Interface Version:
   *       1
   * Implementation Required:
   *       No
   * Parameters:
   *       pThis           -   Pointer to the interface structure itself.
   *       nPageIndex      -   The index of the PDF page.
   *       zoomMode        -   The zoom mode for viewing page. See below.
   *       fPosArray       -   The float array which carries the position info.
   *       sizeofArray     -   The size of float array.
   * PDFZoom values:
   *         - XYZ = 1
   *         - FITPAGE = 2
   *         - FITHORZ = 3
   *         - FITVERT = 4
   *         - FITRECT = 5
   *         - FITBBOX = 6
   *         - FITBHORZ = 7
   *         - FITBVERT = 8
   * Return value:
   *       None.
   * Comments:
   *       See the Destinations description of <<PDF Reference, version 1.7>>
   *       in 8.2.1 for more details.
   */
  void (*FFI_DoGoToAction)(struct _FPDF_FORMFILLINFO* pThis,
                           int nPageIndex,
                           int zoomMode,
                           float* fPosArray,
                           int sizeofArray);

  /*
   * Pointer to IPDF_JSPLATFORM interface.
   * Unused if PDFium is built without V8 support. Otherwise, if NULL, then
   * JavaScript will be prevented from executing while rendering the document.
   */
  IPDF_JSPLATFORM* m_pJsPlatform;

  /* Version 2 - Experimental. */
  /*
   * Whether the XFA module is disabled when built with the XFA module.
   * Interface Version:
   *       Ignored if |version| < 2.
   */
  FPDF_BOOL xfa_disabled;

  /*
   * Method: FFI_DisplayCaret
   *       This method will show the caret at specified position.
   * Interface Version:
   *       Ignored if |version| < 2.
   * Implementation Required:
   *       Required for XFA, otherwise set to NULL.
   * Parameters:
   *       pThis           -   Pointer to the interface structure itself.
   *       page            -   Handle to page. Returned by FPDF_LoadPage().
   *       left            -   Left position of the client area in PDF page
   *                           coordinates.
   *       top             -   Top position of the client area in PDF page
   *                           coordinates.
   *       right           -   Right position of the client area in PDF page
   *                           coordinates.
   *       bottom          -   Bottom position of the client area in PDF page
   *                           coordinates.
   * Return value:
   *       None.
   */
  void (*FFI_DisplayCaret)(struct _FPDF_FORMFILLINFO* pThis,
                           FPDF_PAGE page,
                           FPDF_BOOL bVisible,
                           double left,
                           double top,
                           double right,
                           double bottom);

  /*
   * Method: FFI_GetCurrentPageIndex
   *       This method will get the current page index.
   * Interface Version:
   *       Ignored if |version| < 2.
   * Implementation Required:
   *       Required for XFA, otherwise set to NULL.
   * Parameters:
   *       pThis           -   Pointer to the interface structure itself.
   *       document        -   Handle to document from FPDF_LoadDocument().
   * Return value:
   *       The index of current page.
   */
  int (*FFI_GetCurrentPageIndex)(struct _FPDF_FORMFILLINFO* pThis,
                                 FPDF_DOCUMENT document);

  /*
   * Method: FFI_SetCurrentPage
   *       This method will set the current page.
   * Interface Version:
   *       Ignored if |version| < 2.
   * Implementation Required:
   *       Required for XFA, otherwise set to NULL.
   * Parameters:
   *       pThis           -   Pointer to the interface structure itself.
   *       document        -   Handle to document from FPDF_LoadDocument().
   *       iCurPage        -   The index of the PDF page.
   * Return value:
   *       None.
   */
  void (*FFI_SetCurrentPage)(struct _FPDF_FORMFILLINFO* pThis,
                             FPDF_DOCUMENT document,
                             int iCurPage);

  /*
  * Method: FFI_GotoURL
  *       This method will navigate to the specified URL.
  * Interface Version:
  *       Ignored if |version| < 2.
  * Implementation Required:
  *       Required for XFA, otherwise set to NULL.
  * Parameters:
  *       pThis            -   Pointer to the interface structure itself.
  *       document         -   Handle to document from FPDF_LoadDocument().
  *       wsURL            -   The string value of the URL, in UTF-16LE format.
  * Return value:
  *       None.
  */
  void (*FFI_GotoURL)(struct _FPDF_FORMFILLINFO* pThis,
                      FPDF_DOCUMENT document,
                      FPDF_WIDESTRING wsURL);

  /*
   * Method: FFI_GetPageViewRect
   *       This method will get the current page view rectangle.
   * Interface Version:
   *       Ignored if |version| < 2.
   * Implementation Required:
   *       Required for XFA, otherwise set to NULL.
   * Parameters:
   *       pThis           -   Pointer to the interface structure itself.
   *       page            -   Handle to page. Returned by FPDF_LoadPage().
   *       left            -   The pointer to receive left position of the page
   *                           view area in PDF page coordinates.
   *       top             -   The pointer to receive top position of the page
   *                           view area in PDF page coordinates.
   *       right           -   The pointer to receive right position of the
   *                           page view area in PDF page coordinates.
   *       bottom          -   The pointer to receive bottom position of the
   *                           page view area in PDF page coordinates.
   * Return value:
   *     None.
   */
  void (*FFI_GetPageViewRect)(struct _FPDF_FORMFILLINFO* pThis,
                              FPDF_PAGE page,
                              double* left,
                              double* top,
                              double* right,
                              double* bottom);

  /*
   * Method: FFI_PageEvent
   *       This method fires when pages have been added to or deleted from
   *       the XFA document.
   * Interface Version:
   *       Ignored if |version| < 2.
   * Implementation Required:
   *       Required for XFA, otherwise set to NULL.
   * Parameters:
   *       pThis           -   Pointer to the interface structure itself.
   *       page_count      -   The number of pages to be added or deleted.
   *       event_type      -   See FXFA_PAGEVIEWEVENT_* above.
   * Return value:
   *       None.
   * Comments:
   *       The pages to be added or deleted always start from the last page
   *       of document. This means that if parameter page_count is 2 and
   *       event type is FXFA_PAGEVIEWEVENT_POSTADDED, 2 new pages have been
   *       appended to the tail of document; If page_count is 2 and
   *       event type is FXFA_PAGEVIEWEVENT_POSTREMOVED, the last 2 pages
   *       have been deleted.
   */
  void (*FFI_PageEvent)(struct _FPDF_FORMFILLINFO* pThis,
                        int page_count,
                        FPDF_DWORD event_type);

  /*
   * Method: FFI_PopupMenu
   *       This method will track the right context menu for XFA fields.
   * Interface Version:
   *       Ignored if |version| < 2.
   * Implementation Required:
   *       Required for XFA, otherwise set to NULL.
   * Parameters:
   *       pThis           -   Pointer to the interface structure itself.
   *       page            -   Handle to page. Returned by FPDF_LoadPage().
   *       hWidget         -   Always null, exists for compatibility.
   *       menuFlag        -   The menu flags. Please refer to macro definition
   *                           of FXFA_MENU_XXX and this can be one or a
   *                           combination of these macros.
   *       x               -   X position of the client area in PDF page
   *                           coordinates.
   *       y               -   Y position of the client area in PDF page
   *                           coordinates.
   * Return value:
   *       TRUE indicates success; otherwise false.
   */
  FPDF_BOOL (*FFI_PopupMenu)(struct _FPDF_FORMFILLINFO* pThis,
                             FPDF_PAGE page,
                             FPDF_WIDGET hWidget,
                             int menuFlag,
                             float x,
                             float y);

  /*
   * Method: FFI_OpenFile
   *       This method will open the specified file with the specified mode.
   * Interface Version:
   *       Ignored if |version| < 2.
   * Implementation Required:
   *       Required for XFA, otherwise set to NULL.
   * Parameters:
   *       pThis           -   Pointer to the interface structure itself.
   *       fileFlag        -   The file flag. Please refer to macro definition
   *                           of FXFA_SAVEAS_XXX and use one of these macros.
   *       wsURL           -   The string value of the file URL, in UTF-16LE
   *                           format.
   *       mode            -   The mode for open file, e.g. "rb" or "wb".
   * Return value:
   *       The handle to FPDF_FILEHANDLER.
   */
  FPDF_FILEHANDLER* (*FFI_OpenFile)(struct _FPDF_FORMFILLINFO* pThis,
                                    int fileFlag,
                                    FPDF_WIDESTRING wsURL,
                                    const char* mode);

  /*
   * Method: FFI_EmailTo
   *       This method will email the specified file stream to the specified
   *       contact.
   * Interface Version:
   *       Ignored if |version| < 2.
   * Implementation Required:
   *       Required for XFA, otherwise set to NULL.
   * Parameters:
   *       pThis           -   Pointer to the interface structure itself.
   *       pFileHandler    -   Handle to the FPDF_FILEHANDLER.
   *       pTo             -   A semicolon-delimited list of recipients for the
   *                           message,in UTF-16LE format.
   *       pSubject        -   The subject of the message,in UTF-16LE format.
   *       pCC             -   A semicolon-delimited list of CC recipients for
   *                           the message,in UTF-16LE format.
   *       pBcc            -   A semicolon-delimited list of BCC recipients for
   *                           the message,in UTF-16LE format.
   *       pMsg            -   Pointer to the data buffer to be sent.Can be
   *                           NULL,in UTF-16LE format.
   * Return value:
   *       None.
   */
  void (*FFI_EmailTo)(struct _FPDF_FORMFILLINFO* pThis,
                      FPDF_FILEHANDLER* fileHandler,
                      FPDF_WIDESTRING pTo,
                      FPDF_WIDESTRING pSubject,
                      FPDF_WIDESTRING pCC,
                      FPDF_WIDESTRING pBcc,
                      FPDF_WIDESTRING pMsg);

  /*
   * Method: FFI_UploadTo
   *       This method will upload the specified file stream to the
   *       specified URL.
   * Interface Version:
   *       Ignored if |version| < 2.
   * Implementation Required:
   *       Required for XFA, otherwise set to NULL.
   * Parameters:
   *       pThis           -   Pointer to the interface structure itself.
   *       pFileHandler    -   Handle to the FPDF_FILEHANDLER.
   *       fileFlag        -   The file flag. Please refer to macro definition
   *                           of FXFA_SAVEAS_XXX and use one of these macros.
   *       uploadTo        -   Pointer to the URL path, in UTF-16LE format.
   * Return value:
   *       None.
   */
  void (*FFI_UploadTo)(struct _FPDF_FORMFILLINFO* pThis,
                       FPDF_FILEHANDLER* fileHandler,
                       int fileFlag,
                       FPDF_WIDESTRING uploadTo);

  /*
   * Method: FFI_GetPlatform
   *       This method will get the current platform.
   * Interface Version:
   *       Ignored if |version| < 2.
   * Implementation Required:
   *       Required for XFA, otherwise set to NULL.
   * Parameters:
   *       pThis           -   Pointer to the interface structure itself.
   *       platform        -   Pointer to the data buffer to receive the
   *                           platform,in UTF-16LE format. Can be NULL.
   *       length          -   The length of the buffer in bytes. Can be
   *                           0 to query the required size.
   * Return value:
   *       The length of the buffer, number of bytes.
   */
  int (*FFI_GetPlatform)(struct _FPDF_FORMFILLINFO* pThis,
                         void* platform,
                         int length);

  /*
   * Method: FFI_GetLanguage
   *       This method will get the current language.
   * Interface Version:
   *       Ignored if |version| < 2.
   * Implementation Required:
   *       Required for XFA, otherwise set to NULL.
   * Parameters:
   *       pThis           -   Pointer to the interface structure itself.
   *       language        -   Pointer to the data buffer to receive the
   *                           current language. Can be NULL.
   *       length          -   The length of the buffer in bytes. Can be
   *                           0 to query the required size.
   * Return value:
   *       The length of the buffer, number of bytes.
   */
  int (*FFI_GetLanguage)(struct _FPDF_FORMFILLINFO* pThis,
                         void* language,
                         int length);

  /*
  * Method: FFI_DownloadFromURL
  *       This method will download the specified file from the URL.
  * Interface Version:
  *       Ignored if |version| < 2.
  * Implementation Required:
  *       Required for XFA, otherwise set to NULL.
  * Parameters:
  *       pThis           -   Pointer to the interface structure itself.
  *       URL             -   The string value of the file URL, in UTF-16LE
  *                           format.
  * Return value:
  *       The handle to FPDF_FILEHANDLER.
  */
  FPDF_FILEHANDLER* (*FFI_DownloadFromURL)(struct _FPDF_FORMFILLINFO* pThis,
                                           FPDF_WIDESTRING URL);
  /*
   * Method: FFI_PostRequestURL
   *       This method will post the request to the server URL.
   * Interface Version:
   *       Ignored if |version| < 2.
   * Implementation Required:
   *       Required for XFA, otherwise set to NULL.
   * Parameters:
   *       pThis           -   Pointer to the interface structure itself.
   *       wsURL           -   The string value of the server URL, in UTF-16LE
   *                           format.
   *       wsData          -   The post data,in UTF-16LE format.
   *       wsContentType   -   The content type of the request data, in
   *                           UTF-16LE format.
   *       wsEncode        -   The encode type, in UTF-16LE format.
   *       wsHeader        -   The request header,in UTF-16LE format.
   *       response        -   Pointer to the FPDF_BSTR to receive the response
   *                           data from the server, in UTF-16LE format.
   * Return value:
   *       TRUE indicates success, otherwise FALSE.
   */
  FPDF_BOOL (*FFI_PostRequestURL)(struct _FPDF_FORMFILLINFO* pThis,
                                  FPDF_WIDESTRING wsURL,
                                  FPDF_WIDESTRING wsData,
                                  FPDF_WIDESTRING wsContentType,
                                  FPDF_WIDESTRING wsEncode,
                                  FPDF_WIDESTRING wsHeader,
                                  FPDF_BSTR* response);

  /*
   * Method: FFI_PutRequestURL
   *       This method will put the request to the server URL.
   * Interface Version:
   *       Ignored if |version| < 2.
   * Implementation Required:
   *       Required for XFA, otherwise set to NULL.
   * Parameters:
   *       pThis           -   Pointer to the interface structure itself.
   *       wsURL           -   The string value of the server URL, in UTF-16LE
   *                           format.
   *       wsData          -   The put data, in UTF-16LE format.
   *       wsEncode        -   The encode type, in UTR-16LE format.
   * Return value:
   *       TRUE indicates success, otherwise FALSE.
   */
  FPDF_BOOL (*FFI_PutRequestURL)(struct _FPDF_FORMFILLINFO* pThis,
                                   FPDF_WIDESTRING wsURL,
                                   FPDF_WIDESTRING wsData,
                                   FPDF_WIDESTRING wsEncode);
} FPDF_FORMFILLINFO;

/*
 * Function: FPDFDOC_InitFormFillEnvironment
 *       Initialize form fill environment.
 * Parameters:
 *       document        -   Handle to document from FPDF_LoadDocument().
 *       pFormFillInfo   -   Pointer to a FPDF_FORMFILLINFO structure.
 * Return Value:
 *       Handle to the form fill module, or NULL on failure.
 * Comments:
 *       This function should be called before any form fill operation.
 */
FPDF_EXPORT FPDF_FORMHANDLE FPDF_CALLCONV
FPDFDOC_InitFormFillEnvironment(FPDF_DOCUMENT document,
                                FPDF_FORMFILLINFO* formInfo);

/*
 * Function: FPDFDOC_ExitFormFillEnvironment
 *       Take ownership of |hHandle| and exit form fill environment.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 * Return Value:
 *       None.
 * Comments:
 *       This function is a no-op when |hHandle| is null.
 */
FPDF_EXPORT void FPDF_CALLCONV
FPDFDOC_ExitFormFillEnvironment(FPDF_FORMHANDLE hHandle);

/*
 * Function: FORM_OnAfterLoadPage
 *       This method is required for implementing all the form related
 *       functions. Should be invoked after user successfully loaded a
 *       PDF page, and FPDFDOC_InitFormFillEnvironment() has been invoked.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as eturned by
 *                       FPDFDOC_InitFormFillEnvironment().
 * Return Value:
 *       None.
 */
FPDF_EXPORT void FPDF_CALLCONV FORM_OnAfterLoadPage(FPDF_PAGE page,
                                                    FPDF_FORMHANDLE hHandle);

/*
 * Function: FORM_OnBeforeClosePage
 *       This method is required for implementing all the form related
 *       functions. Should be invoked before user closes the PDF page.
 * Parameters:
 *        page        -   Handle to the page, as returned by FPDF_LoadPage().
 *        hHandle     -   Handle to the form fill module, as returned by
 *                        FPDFDOC_InitFormFillEnvironment().
 * Return Value:
 *        None.
 */
FPDF_EXPORT void FPDF_CALLCONV FORM_OnBeforeClosePage(FPDF_PAGE page,
                                                      FPDF_FORMHANDLE hHandle);

/*
 * Function: FORM_DoDocumentJSAction
 *       This method is required for performing document-level JavaScript
 *       actions. It should be invoked after the PDF document has been loaded.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 * Return Value:
 *       None.
 * Comments:
 *       If there is document-level JavaScript action embedded in the
 *       document, this method will execute the JavaScript action. Otherwise,
 *       the method will do nothing.
 */
FPDF_EXPORT void FPDF_CALLCONV
FORM_DoDocumentJSAction(FPDF_FORMHANDLE hHandle);

/*
 * Function: FORM_DoDocumentOpenAction
 *       This method is required for performing open-action when the document
 *       is opened.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 * Return Value:
 *       None.
 * Comments:
 *       This method will do nothing if there are no open-actions embedded
 *       in the document.
 */
FPDF_EXPORT void FPDF_CALLCONV
FORM_DoDocumentOpenAction(FPDF_FORMHANDLE hHandle);

// Additional actions type of document:
//   WC, before closing document, JavaScript action.
//   WS, before saving document, JavaScript action.
//   DS, after saving document, JavaScript action.
//   WP, before printing document, JavaScript action.
//   DP, after printing document, JavaScript action.
#define FPDFDOC_AACTION_WC 0x10
#define FPDFDOC_AACTION_WS 0x11
#define FPDFDOC_AACTION_DS 0x12
#define FPDFDOC_AACTION_WP 0x13
#define FPDFDOC_AACTION_DP 0x14

/*
 * Function: FORM_DoDocumentAAction
 *       This method is required for performing the document's
 *       additional-action.
 * Parameters:
 *       hHandle     -   Handle to the form fill module. Returned by
 *                       FPDFDOC_InitFormFillEnvironment.
 *       aaType      -   The type of the additional-actions which defined
 *                       above.
 * Return Value:
 *       None.
 * Comments:
 *       This method will do nothing if there is no document
 *       additional-action corresponding to the specified |aaType|.
 */
FPDF_EXPORT void FPDF_CALLCONV FORM_DoDocumentAAction(FPDF_FORMHANDLE hHandle,
                                                      int aaType);

// Additional-action types of page object:
//   OPEN (/O) -- An action to be performed when the page is opened
//   CLOSE (/C) -- An action to be performed when the page is closed
#define FPDFPAGE_AACTION_OPEN 0
#define FPDFPAGE_AACTION_CLOSE 1

/*
 * Function: FORM_DoPageAAction
 *       This method is required for performing the page object's
 *       additional-action when opened or closed.
 * Parameters:
 *       page        -   Handle to the page, as returned by FPDF_LoadPage().
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *       aaType      -   The type of the page object's additional-actions
 *                       which defined above.
 * Return Value:
 *       None.
 * Comments:
 *       This method will do nothing if no additional-action corresponding
 *       to the specified |aaType| exists.
 */
FPDF_EXPORT void FPDF_CALLCONV FORM_DoPageAAction(FPDF_PAGE page,
                                                  FPDF_FORMHANDLE hHandle,
                                                  int aaType);

/*
 * Function: FORM_OnMouseMove
 *       Call this member function when the mouse cursor moves.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *       page        -   Handle to the page, as returned by FPDF_LoadPage().
 *       modifier    -   Indicates whether various virtual keys are down.
 *       page_x      -   Specifies the x-coordinate of the cursor in PDF user
 *                       space.
 *       page_y      -   Specifies the y-coordinate of the cursor in PDF user
 *                       space.
 * Return Value:
 *       True indicates success; otherwise false.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_OnMouseMove(FPDF_FORMHANDLE hHandle,
                                                     FPDF_PAGE page,
                                                     int modifier,
                                                     double page_x,
                                                     double page_y);

/*
 * Function: FORM_OnFocus
 *       This function focuses the form annotation at a given point. If the
 *       annotation at the point already has focus, nothing happens. If there
 *       is no annotation at the point, removes form focus.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *       page        -   Handle to the page, as returned by FPDF_LoadPage().
 *       modifier    -   Indicates whether various virtual keys are down.
 *       page_x      -   Specifies the x-coordinate of the cursor in PDF user
 *                       space.
 *       page_y      -   Specifies the y-coordinate of the cursor in PDF user
 *                       space.
 * Return Value:
 *       True if there is an annotation at the given point and it has focus.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_OnFocus(FPDF_FORMHANDLE hHandle,
                                                 FPDF_PAGE page,
                                                 int modifier,
                                                 double page_x,
                                                 double page_y);

/*
 * Function: FORM_OnLButtonDown
 *       Call this member function when the user presses the left
 *       mouse button.
 * Parameters:
 *       hHandle     -   Handle to the form fill module. as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *       page        -   Handle to the page, as returned by FPDF_LoadPage().
 *       modifier    -   Indicates whether various virtual keys are down.
 *       page_x      -   Specifies the x-coordinate of the cursor in PDF user
 *                       space.
 *       page_y      -   Specifies the y-coordinate of the cursor in PDF user
 *                       space.
 * Return Value:
 *       True indicates success; otherwise false.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_OnLButtonDown(FPDF_FORMHANDLE hHandle,
                                                       FPDF_PAGE page,
                                                       int modifier,
                                                       double page_x,
                                                       double page_y);

/*
 * Function: FORM_OnRButtonDown
 *       Same as above, execpt for the right mouse button.
 * Comments:
 *       At the present time, has no effect except in XFA builds, but is
 *       included for the sake of symmetry.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_OnRButtonDown(FPDF_FORMHANDLE hHandle,
                                                       FPDF_PAGE page,
                                                       int modifier,
                                                       double page_x,
                                                       double page_y);
/*
 * Function: FORM_OnLButtonUp
 *       Call this member function when the user releases the left
 *       mouse button.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *       page        -   Handle to the page. as returned by FPDF_LoadPage().
 *       modifier    -   Indicates whether various virtual keys are down.
 *       page_x      -   Specifies the x-coordinate of the cursor in device.
 *       page_y      -   Specifies the y-coordinate of the cursor in device.
 * Return Value:
 *       True indicates success; otherwise false.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_OnLButtonUp(FPDF_FORMHANDLE hHandle,
                                                     FPDF_PAGE page,
                                                     int modifier,
                                                     double page_x,
                                                     double page_y);

/*
 * Function: FORM_OnRButtonUp
 *       Same as above, execpt for the right mouse button.
 * Comments:
 *       At the present time, has no effect except in XFA builds, but is
 *       included for the sake of symmetry.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_OnRButtonUp(FPDF_FORMHANDLE hHandle,
                                                     FPDF_PAGE page,
                                                     int modifier,
                                                     double page_x,
                                                     double page_y);

/*
 * Function: FORM_OnLButtonDoubleClick
 *       Call this member function when the user double clicks the
 *       left mouse button.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *       page        -   Handle to the page, as returned by FPDF_LoadPage().
 *       modifier    -   Indicates whether various virtual keys are down.
 *       page_x      -   Specifies the x-coordinate of the cursor in PDF user
 *                       space.
 *       page_y      -   Specifies the y-coordinate of the cursor in PDF user
 *                       space.
 * Return Value:
 *       True indicates success; otherwise false.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FORM_OnLButtonDoubleClick(FPDF_FORMHANDLE hHandle,
                          FPDF_PAGE page,
                          int modifier,
                          double page_x,
                          double page_y);

/*
 * Function: FORM_OnKeyDown
 *       Call this member function when a nonsystem key is pressed.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, aseturned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *       page        -   Handle to the page, as returned by FPDF_LoadPage().
 *       nKeyCode    -   Indicates whether various virtual keys are down.
 *       modifier    -   Contains the scan code, key-transition code,
 *                       previous key state, and context code.
 * Return Value:
 *       True indicates success; otherwise false.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_OnKeyDown(FPDF_FORMHANDLE hHandle,
                                                   FPDF_PAGE page,
                                                   int nKeyCode,
                                                   int modifier);

/*
 * Function: FORM_OnKeyUp
 *       Call this member function when a nonsystem key is released.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *       page        -   Handle to the page, as returned by FPDF_LoadPage().
 *       nKeyCode    -   The virtual-key code of the given key.
 *       modifier    -   Contains the scan code, key-transition code,
 *                       previous key state, and context code.
 * Return Value:
 *       True indicates success; otherwise false.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_OnKeyUp(FPDF_FORMHANDLE hHandle,
                                                 FPDF_PAGE page,
                                                 int nKeyCode,
                                                 int modifier);

/*
 * Function: FORM_OnChar
 *       Call this member function when a keystroke translates to a
 *       nonsystem character.
 * Parameters:
 *        hHandle    -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *        page       -   Handle to the page, as returned by FPDF_LoadPage().
 *        nChar      -   The character code value of the key.
 *        modifier   -   Contains the scan code, key-transition code,
 *                       previous key state, and context code.
 * Return Value:
 *       True indicates success; otherwise false.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_OnChar(FPDF_FORMHANDLE hHandle,
                                                FPDF_PAGE page,
                                                int nChar,
                                                int modifier);

/*
 * Experimental API
 * Function: FORM_GetFocusedText
 *       Call this function to obtain the text within the current focused
 *       field, if any.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *       page        -   Handle to the page, as returned by FPDF_LoadPage().
 *       buffer      -   Buffer for holding the form text, encoded in
 *                       UTF-16LE. If NULL, |buffer| is not modified.
 *       buflen      -   Length of |buffer| in bytes. If |buflen| is less
 *                       than the length of the form text string, |buffer| is
 *                       not modified.
 * Return Value:
 *       Length in bytes for the text in the focused field.
 */
FPDF_EXPORT unsigned long FPDF_CALLCONV
FORM_GetFocusedText(FPDF_FORMHANDLE hHandle,
                    FPDF_PAGE page,
                    void* buffer,
                    unsigned long buflen);

/*
 * Function: FORM_GetSelectedText
 *       Call this function to obtain selected text within a form text
 *       field or form combobox text field.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, asr eturned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *       page        -   Handle to the page, as returned by FPDF_LoadPage().
 *       buffer      -   Buffer for holding the selected text, encoded in
 *                       UTF-16LE. If NULL, |buffer| is not modified.
 *       buflen      -   Length of |buffer| in bytes. If |buflen| is less
 *                       than the length of the selected text string,
 *                       |buffer| is not modified.
 * Return Value:
 *       Length in bytes of selected text in form text field or form combobox
 *       text field.
 */
FPDF_EXPORT unsigned long FPDF_CALLCONV
FORM_GetSelectedText(FPDF_FORMHANDLE hHandle,
                     FPDF_PAGE page,
                     void* buffer,
                     unsigned long buflen);

/*
 * Function: FORM_ReplaceSelection
 *       Call this function to replace the selected text in a form
 *       text field or user-editable form combobox text field with another
 *       text string (which can be empty or non-empty). If there is no
 *       selected text, this function will append the replacement text after
 *       the current caret position.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *       page        -   Handle to the page, as Returned by FPDF_LoadPage().
 *       wsText      -   The text to be inserted, in UTF-16LE format.
 * Return Value:
 *       None.
 */
FPDF_EXPORT void FPDF_CALLCONV FORM_ReplaceSelection(FPDF_FORMHANDLE hHandle,
                                                     FPDF_PAGE page,
                                                     FPDF_WIDESTRING wsText);

/*
 * Function: FORM_CanUndo
 *       Find out if it is possible for the current focused widget in a given
 *       form to perform an undo operation.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *       page        -   Handle to the page, as returned by FPDF_LoadPage().
 * Return Value:
 *       True if it is possible to undo.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_CanUndo(FPDF_FORMHANDLE hHandle,
                                                 FPDF_PAGE page);

/*
 * Function: FORM_CanRedo
 *       Find out if it is possible for the current focused widget in a given
 *       form to perform a redo operation.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *       page        -   Handle to the page, as returned by FPDF_LoadPage().
 * Return Value:
 *       True if it is possible to redo.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_CanRedo(FPDF_FORMHANDLE hHandle,
                                                 FPDF_PAGE page);

/*
 * Function: FORM_Undo
 *       Make the current focussed widget perform an undo operation.
 * Parameters:
 *       hHandle     -   Handle to the form fill module. as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *       page        -   Handle to the page, as returned by FPDF_LoadPage().
 * Return Value:
 *       True if the undo operation succeeded.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_Undo(FPDF_FORMHANDLE hHandle,
                                              FPDF_PAGE page);

/*
 * Function: FORM_Redo
 *       Make the current focussed widget perform a redo operation.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *       page        -   Handle to the page, as eturned by FPDF_LoadPage().
 * Return Value:
 *       True if the redo operation succeeded.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FORM_Redo(FPDF_FORMHANDLE hHandle,
                                              FPDF_PAGE page);

/*
 * Function: FORM_ForceToKillFocus.
 *       Call this member function to force to kill the focus of the form
 *       field which has focus. If it would kill the focus of a form field,
 *       save the value of form field if was changed by theuser.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 * Return Value:
 *       True indicates success; otherwise false.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FORM_ForceToKillFocus(FPDF_FORMHANDLE hHandle);

// Form Field Types
// The names of the defines are stable, but the specific values associated with
// them are not, so do not hardcode their values.
#define FPDF_FORMFIELD_UNKNOWN 0      // Unknown.
#define FPDF_FORMFIELD_PUSHBUTTON 1   // push button type.
#define FPDF_FORMFIELD_CHECKBOX 2     // check box type.
#define FPDF_FORMFIELD_RADIOBUTTON 3  // radio button type.
#define FPDF_FORMFIELD_COMBOBOX 4     // combo box type.
#define FPDF_FORMFIELD_LISTBOX 5      // list box type.
#define FPDF_FORMFIELD_TEXTFIELD 6    // text field type.
#define FPDF_FORMFIELD_SIGNATURE 7    // text field type.
#ifdef PDF_ENABLE_XFA
#define FPDF_FORMFIELD_XFA 8              // Generic XFA type.
#define FPDF_FORMFIELD_XFA_CHECKBOX 9     // XFA check box type.
#define FPDF_FORMFIELD_XFA_COMBOBOX 10    // XFA combo box type.
#define FPDF_FORMFIELD_XFA_IMAGEFIELD 11  // XFA image field type.
#define FPDF_FORMFIELD_XFA_LISTBOX 12     // XFA list box type.
#define FPDF_FORMFIELD_XFA_PUSHBUTTON 13  // XFA push button type.
#define FPDF_FORMFIELD_XFA_SIGNATURE 14   // XFA signture field type.
#define FPDF_FORMFIELD_XFA_TEXTFIELD 15   // XFA text field type.
#endif                                    // PDF_ENABLE_XFA

#ifdef PDF_ENABLE_XFA
#define FPDF_FORMFIELD_COUNT 16
#else  // PDF_ENABLE_XFA
#define FPDF_FORMFIELD_COUNT 8
#endif  // PDF_ENABLE_XFA

#ifdef PDF_ENABLE_XFA
#define IS_XFA_FORMFIELD(type)                  \
  (((type) == FPDF_FORMFIELD_XFA) ||            \
   ((type) == FPDF_FORMFIELD_XFA_CHECKBOX) ||   \
   ((type) == FPDF_FORMFIELD_XFA_COMBOBOX) ||   \
   ((type) == FPDF_FORMFIELD_XFA_IMAGEFIELD) || \
   ((type) == FPDF_FORMFIELD_XFA_LISTBOX) ||    \
   ((type) == FPDF_FORMFIELD_XFA_PUSHBUTTON) || \
   ((type) == FPDF_FORMFIELD_XFA_SIGNATURE) ||  \
   ((type) == FPDF_FORMFIELD_XFA_TEXTFIELD))
#endif  // PDF_ENABLE_XFA

/*
 * Function: FPDFPage_HasFormFieldAtPoint
 *     Get the form field type by point.
 * Parameters:
 *     hHandle     -   Handle to the form fill module. Returned by
 *                     FPDFDOC_InitFormFillEnvironment().
 *     page        -   Handle to the page. Returned by FPDF_LoadPage().
 *     page_x      -   X position in PDF "user space".
 *     page_y      -   Y position in PDF "user space".
 * Return Value:
 *     Return the type of the form field; -1 indicates no field.
 *     See field types above.
 */
FPDF_EXPORT int FPDF_CALLCONV
FPDFPage_HasFormFieldAtPoint(FPDF_FORMHANDLE hHandle,
                             FPDF_PAGE page,
                             double page_x,
                             double page_y);

/*
 * Function: FPDFPage_FormFieldZOrderAtPoint
 *     Get the form field z-order by point.
 * Parameters:
 *     hHandle     -   Handle to the form fill module. Returned by
 *                     FPDFDOC_InitFormFillEnvironment().
 *     page        -   Handle to the page. Returned by FPDF_LoadPage().
 *     page_x      -   X position in PDF "user space".
 *     page_y      -   Y position in PDF "user space".
 * Return Value:
 *     Return the z-order of the form field; -1 indicates no field.
 *     Higher numbers are closer to the front.
 */
FPDF_EXPORT int FPDF_CALLCONV
FPDFPage_FormFieldZOrderAtPoint(FPDF_FORMHANDLE hHandle,
                                FPDF_PAGE page,
                                double page_x,
                                double page_y);

/*
 * Function: FPDF_SetFormFieldHighlightColor
 *       Set the highlight color of the specified (or all) form fields
 *       in the document.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *       doc         -   Handle to the document, as returned by
 *                       FPDF_LoadDocument().
 *       fieldType   -   A 32-bit integer indicating the type of a form
 *                       field (defined above).
 *       color       -   The highlight color of the form field. Constructed by
 *                       0xxxrrggbb.
 * Return Value:
 *       None.
 * Comments:
 *       When the parameter fieldType is set to FPDF_FORMFIELD_UNKNOWN, the
 *       highlight color will be applied to all the form fields in the
 *       document.
 *       Please refresh the client window to show the highlight immediately
 *       if necessary.
 */
FPDF_EXPORT void FPDF_CALLCONV
FPDF_SetFormFieldHighlightColor(FPDF_FORMHANDLE hHandle,
                                int fieldType,
                                unsigned long color);

/*
 * Function: FPDF_SetFormFieldHighlightAlpha
 *       Set the transparency of the form field highlight color in the
 *       document.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 *       doc         -   Handle to the document, as returaned by
 *                       FPDF_LoadDocument().
 *       alpha       -   The transparency of the form field highlight color,
 *                       between 0-255.
 * Return Value:
 *       None.
 */
FPDF_EXPORT void FPDF_CALLCONV
FPDF_SetFormFieldHighlightAlpha(FPDF_FORMHANDLE hHandle, unsigned char alpha);

/*
 * Function: FPDF_RemoveFormFieldHighlight
 *       Remove the form field highlight color in the document.
 * Parameters:
 *       hHandle     -   Handle to the form fill module, as returned by
 *                       FPDFDOC_InitFormFillEnvironment().
 * Return Value:
 *       None.
 * Comments:
 *       Please refresh the client window to remove the highlight immediately
 *       if necessary.
 */
FPDF_EXPORT void FPDF_CALLCONV
FPDF_RemoveFormFieldHighlight(FPDF_FORMHANDLE hHandle);

/*
* Function: FPDF_FFLDraw
*       Render FormFields and popup window on a page to a device independent
*       bitmap.
* Parameters:
*       hHandle      -   Handle to the form fill module, as returned by
*                        FPDFDOC_InitFormFillEnvironment().
*       bitmap       -   Handle to the device independent bitmap (as the
*                        output buffer). Bitmap handles can be created by
*                        FPDFBitmap_Create().
*       page         -   Handle to the page, as returned by FPDF_LoadPage().
*       start_x      -   Left pixel position of the display area in the
*                        device coordinates.
*       start_y      -   Top pixel position of the display area in the device
*                        coordinates.
*       size_x       -   Horizontal size (in pixels) for displaying the page.
*       size_y       -   Vertical size (in pixels) for displaying the page.
*       rotate       -   Page orientation: 0 (normal), 1 (rotated 90 degrees
*                        clockwise), 2 (rotated 180 degrees), 3 (rotated 90
*                        degrees counter-clockwise).
*       flags        -   0 for normal display, or combination of flags
*                        defined above.
* Return Value:
*       None.
* Comments:
*       This function is designed to render annotations that are
*       user-interactive, which are widget annotations (for FormFields) and
*       popup annotations.
*       With the FPDF_ANNOT flag, this function will render a popup annotation
*       when users mouse-hover on a non-widget annotation. Regardless of
*       FPDF_ANNOT flag, this function will always render widget annotations
*       for FormFields.
*       In order to implement the FormFill functions, implementation should
*       call this function after rendering functions, such as
*       FPDF_RenderPageBitmap() or FPDF_RenderPageBitmap_Start(), have
*       finished rendering the page contents.
*/
FPDF_EXPORT void FPDF_CALLCONV FPDF_FFLDraw(FPDF_FORMHANDLE hHandle,
                                            FPDF_BITMAP bitmap,
                                            FPDF_PAGE page,
                                            int start_x,
                                            int start_y,
                                            int size_x,
                                            int size_y,
                                            int rotate,
                                            int flags);

#ifdef _SKIA_SUPPORT_
FPDF_EXPORT void FPDF_CALLCONV FPDF_FFLRecord(FPDF_FORMHANDLE hHandle,
                                              FPDF_RECORDER recorder,
                                              FPDF_PAGE page,
                                              int start_x,
                                              int start_y,
                                              int size_x,
                                              int size_y,
                                              int rotate,
                                              int flags);
#endif

/*
 * Experimental API
 * Function: FPDF_GetFormType
 *           Returns the type of form contained in the PDF document.
 * Parameters:
 *           document - Handle to document.
 * Return Value:
 *           Integer value representing one of the FORMTYPE_ values.
 * Comments:
 *           If |document| is NULL, then the return value is FORMTYPE_NONE.
 */
FPDF_EXPORT int FPDF_CALLCONV FPDF_GetFormType(FPDF_DOCUMENT document);

/*
 * Experimental API
 * Function: FORM_SetIndexSelected
 *           Selects/deselects the value at the given |index| of the focused
 *           annotation.
 * Parameters:
 *           hHandle     -   Handle to the form fill module. Returned by
 *                           FPDFDOC_InitFormFillEnvironment.
 *           page        -   Handle to the page. Returned by FPDF_LoadPage
 *           index       -   0-based index of value to be set as
 *                           selected/unselected
 *           selected    -   true to select, false to deselect
 * Return Value:
 *           TRUE if the operation succeeded.
 *           FALSE if the operation failed or widget is not a supported type.
 * Comments:
 *           Intended for use with listbox/combobox widget types. Comboboxes
 *           have at most a single value selected at a time which cannot be
 *           deselected. Deselect on a combobox is a no-op that returns false.
 *           Default implementation is a no-op that will return false for
 *           other types.
 *           Not currently supported for XFA forms - will return false.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FORM_SetIndexSelected(FPDF_FORMHANDLE hHandle,
                      FPDF_PAGE page,
                      int index,
                      FPDF_BOOL selected);

/*
 * Experimental API
 * Function: FORM_IsIndexSelected
 *           Returns whether or not the value at |index| of the focused
 *           annotation is currently selected.
 * Parameters:
 *           hHandle     -   Handle to the form fill module. Returned by
 *                           FPDFDOC_InitFormFillEnvironment.
 *           page        -   Handle to the page. Returned by FPDF_LoadPage
 *           index       -   0-based Index of value to check
 * Return Value:
 *           TRUE if value at |index| is currently selected.
 *           FALSE if value at |index| is not selected or widget is not a
 *           supported type.
 * Comments:
 *           Intended for use with listbox/combobox widget types. Default
 *           implementation is a no-op that will return false for other types.
 *           Not currently supported for XFA forms - will return false.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FORM_IsIndexSelected(FPDF_FORMHANDLE hHandle, FPDF_PAGE page, int index);

/*
 * Function: FPDF_LoadXFA
 *          If the document consists of XFA fields, call this method to
 *          attempt to load XFA fields.
 * Parameters:
 *          document     -   Handle to document from FPDF_LoadDocument().
 * Return Value:
 *          TRUE upon success, otherwise FALSE. If XFA support is not built
 *          into PDFium, performs no action and always returns FALSE.
 */
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDF_LoadXFA(FPDF_DOCUMENT document);

#ifdef __cplusplus
}
#endif

#endif  // PUBLIC_FPDF_FORMFILL_H_
