1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 
7 #ifndef PUBLIC_FPDF_FORMFILL_H_
8 #define PUBLIC_FPDF_FORMFILL_H_
9 
10 #include "fpdfview.h"
11 
12 typedef void* FPDF_FORMHANDLE;
13 
14 #ifdef PDF_ENABLE_XFA
15 #define DOCTYPE_PDF 0          // Normal pdf Document
16 #define DOCTYPE_DYNAMIC_XFA 1  // Dynamic xfa Document Type
17 #define DOCTYPE_STATIC_XFA 2   // Static xfa Document Type
18 #endif  // PDF_ENABLE_XFA
19 
20 // Exported Functions
21 #ifdef __cplusplus
22 extern "C" {
23 #endif
24 
25 typedef struct _IPDF_JsPlatform {
26   /**
27   * Version number of the interface. Currently must be 2.
28   **/
29   int version;
30 
31   /* Version 1. */
32 
33   /**
34   * Method: app_alert
35   *           pop up a dialog to show warning or hint.
36   * Interface Version:
37   *           1
38   * Implementation Required:
39   *           yes
40   * Parameters:
41   *           pThis       -   Pointer to the interface structure itself
42   *           Msg         -   A string containing the message to be displayed.
43   *           Title       -   The title of the dialog.
44   *           Type        -   The stype of button group.
45   *                           0-OK(default);
46   *                           1-OK,Cancel;
47   *                           2-Yes,NO;
48   *                           3-Yes, NO, Cancel.
49   *           nIcon       -   The Icon type.
50   *                           0-Error(default);
51   *                           1-Warning;
52   *                           2-Question;
53   *                           3-Status.
54   *                           4-Asterisk
55   * Return Value:
56   *           The return value could be the folowing type:
57   *                           1-OK;
58   *                           2-Cancel;
59   *                           3-NO;
60   *                           4-Yes;
61   */
62   int (*app_alert)(struct _IPDF_JsPlatform* pThis,
63                    FPDF_WIDESTRING Msg,
64                    FPDF_WIDESTRING Title,
65                    int Type,
66                    int Icon);
67 
68   /**
69   * Method: app_beep
70   *           Causes the system to play a sound.
71   * Interface Version:
72   *           1
73   * Implementation Required:
74   *           yes
75   * Parameters:
76   *           pThis       -   Pointer to the interface structure itself
77   *           nType       -   The sound type.
78   *                           0 - Error
79   *                           1 - Warning
80   *                           2 - Question
81   *                           3 - Status
82   *                           4 - Default (default value)
83   * Return Value:
84   *           None
85   */
86   void (*app_beep)(struct _IPDF_JsPlatform* pThis, int nType);
87 
88   /**
89   * Method: app_response
90   *           Displays a dialog box containing a question and an entry field for
91   * the user to reply to the question.
92   * Interface Version:
93   *           1
94   * Implementation Required:
95   *           yes
96   * Parameters:
97   *           pThis       -   Pointer to the interface structure itself
98   *           Question    -   The question to be posed to the user.
99   *           Title       -   The title of the dialog box.
100   *           Default     -   A default value for the answer to the question. If
101   * not specified, no default value is presented.
102   *           cLabel      -   A short string to appear in front of and on the
103   * same line as the edit text field.
104   *           bPassword   -   If true, indicates that the user's response should
105   * show as asterisks (*) or bullets (?) to mask the response, which might be
106   * sensitive information. The default is false.
107   *           response    -   A string buffer allocated by SDK, to receive the
108   * user's response.
109   *           length      -   The length of the buffer, number of bytes.
110   * Currently, It's always be 2048.
111   * Return Value:
112   *       Number of bytes the complete user input would actually require, not
113   * including trailing zeros, regardless of the value of the length
114   *       parameter or the presence of the response buffer.
115   * Comments:
116   *       No matter on what platform, the response buffer should be always
117   * written using UTF-16LE encoding. If a response buffer is
118   *       present and the size of the user input exceeds the capacity of the
119   * buffer as specified by the length parameter, only the
120   *       first "length" bytes of the user input are to be written to the
121   * buffer.
122   */
123   int (*app_response)(struct _IPDF_JsPlatform* pThis,
124                       FPDF_WIDESTRING Question,
125                       FPDF_WIDESTRING Title,
126                       FPDF_WIDESTRING Default,
127                       FPDF_WIDESTRING cLabel,
128                       FPDF_BOOL bPassword,
129                       void* response,
130                       int length);
131 
132   /*
133   * Method: Doc_getFilePath
134   *           Get the file path of the current document.
135   * Interface Version:
136   *           1
137   * Implementation Required:
138   *           yes
139   * Parameters:
140   *           pThis       -   Pointer to the interface structure itself
141   *           filePath    -   The string buffer to receive the file path. Can be
142   * NULL.
143   *           length      -   The length of the buffer, number of bytes. Can be
144   * 0.
145   * Return Value:
146   *       Number of bytes the filePath consumes, including trailing zeros.
147   * Comments:
148   *       The filePath should be always input in local encoding.
149   *
150   *       The return value always indicated number of bytes required for the
151   * buffer, even when there is
152   *       no buffer specified, or the buffer size is less then required. In this
153   * case, the buffer will not
154   *       be modified.
155   */
156   int (*Doc_getFilePath)(struct _IPDF_JsPlatform* pThis,
157                          void* filePath,
158                          int length);
159 
160   /*
161   * Method: Doc_mail
162   *           Mails the data buffer as an attachment to all recipients, with or
163   * without user interaction.
164   * Interface Version:
165   *           1
166   * Implementation Required:
167   *           yes
168   * Parameters:
169   *           pThis       -   Pointer to the interface structure itself
170   *           mailData    -   Pointer to the data buffer to be sent.Can be NULL.
171   *           length      -   The size,in bytes, of the buffer pointed by
172   * mailData parameter.Can be 0.
173   *           bUI         -   If true, the rest of the parameters are used in a
174   * compose-new-message window that is displayed to the user. If false, the cTo
175   * parameter is required and all others are optional.
176   *           To          -   A semicolon-delimited list of recipients for the
177   * message.
178   *           Subject     -   The subject of the message. The length limit is 64
179   * KB.
180   *           CC          -   A semicolon-delimited list of CC recipients for
181   * the message.
182   *           BCC         -   A semicolon-delimited list of BCC recipients for
183   * the message.
184   *           Msg         -   The content of the message. The length limit is 64
185   * KB.
186   * Return Value:
187   *           None.
188   * Comments:
189   *           If the parameter mailData is NULL or length is 0, the current
190   * document will be mailed as an attachment to all recipients.
191   */
192   void (*Doc_mail)(struct _IPDF_JsPlatform* pThis,
193                    void* mailData,
194                    int length,
195                    FPDF_BOOL bUI,
196                    FPDF_WIDESTRING To,
197                    FPDF_WIDESTRING Subject,
198                    FPDF_WIDESTRING CC,
199                    FPDF_WIDESTRING BCC,
200                    FPDF_WIDESTRING Msg);
201 
202   /*
203   * Method: Doc_print
204   *           Prints all or a specific number of pages of the document.
205   * Interface Version:
206   *           1
207   * Implementation Required:
208   *           yes
209   * Parameters:
210   *           pThis       -   Pointer to the interface structure itself.
211   *           bUI         -   If true, will cause a UI to be presented to the
212   * user to obtain printing information and confirm the action.
213   *           nStart      -   A 0-based index that defines the start of an
214   * inclusive range of pages.
215   *           nEnd        -   A 0-based index that defines the end of an
216   * inclusive page range.
217   *           bSilent     -   If true, suppresses the cancel dialog box while
218   * the document is printing. The default is false.
219   *           bShrinkToFit    -   If true, the page is shrunk (if necessary) to
220   * fit within the imageable area of the printed page.
221   *           bPrintAsImage   -   If true, print pages as an image.
222   *           bReverse    -   If true, print from nEnd to nStart.
223   *           bAnnotations    -   If true (the default), annotations are
224   * printed.
225   */
226   void (*Doc_print)(struct _IPDF_JsPlatform* pThis,
227                     FPDF_BOOL bUI,
228                     int nStart,
229                     int nEnd,
230                     FPDF_BOOL bSilent,
231                     FPDF_BOOL bShrinkToFit,
232                     FPDF_BOOL bPrintAsImage,
233                     FPDF_BOOL bReverse,
234                     FPDF_BOOL bAnnotations);
235 
236   /*
237   * Method: Doc_submitForm
238   *           Send the form data to a specified URL.
239   * Interface Version:
240   *           1
241   * Implementation Required:
242   *           yes
243   * Parameters:
244   *           pThis       -   Pointer to the interface structure itself
245   *           formData    -   Pointer to the data buffer to be sent.
246   *           length      -   The size,in bytes, of the buffer pointed by
247   * formData parameter.
248   *           URL         -   The URL to send to.
249   * Return Value:
250   *           None.
251   *
252   */
253   void (*Doc_submitForm)(struct _IPDF_JsPlatform* pThis,
254                          void* formData,
255                          int length,
256                          FPDF_WIDESTRING URL);
257 
258   /*
259   * Method: Doc_gotoPage
260   *           Jump to a specified page.
261   * Interface Version:
262   *           1
263   * Implementation Required:
264   *           yes
265   * Parameters:
266   *           pThis       -   Pointer to the interface structure itself
267   *           nPageNum    -   The specified page number, zero for the first
268   * page.
269   * Return Value:
270   *           None.
271   *
272   */
273   void (*Doc_gotoPage)(struct _IPDF_JsPlatform* pThis, int nPageNum);
274   /*
275   * Method: Field_browse
276   *           Show a file selection dialog, and return the selected file path.
277   * Interface Version:
278   *           1
279   * Implementation Required:
280   *           yes
281   * Parameters:
282   *           pThis       -   Pointer to the interface structure itself.
283   *           filePath    -   Pointer to the data buffer to receive the file
284   * path.Can be NULL.
285   *           length      -   The length of the buffer, number of bytes. Can be
286   * 0.
287   * Return Value:
288   *       Number of bytes the filePath consumes, including trailing zeros.
289   * Comments:
290   *       The filePath shoule be always input in local encoding.
291   */
292   int (*Field_browse)(struct _IPDF_JsPlatform* pThis,
293                       void* filePath,
294                       int length);
295 
296   /**
297   *   pointer to FPDF_FORMFILLINFO interface.
298   **/
299   void* m_pFormfillinfo;
300 
301   /* Version 2. */
302 
303   void* m_isolate;               /* Unused in v3, retain for compatibility. */
304   unsigned int m_v8EmbedderSlot; /* Unused in v3, retain for compatibility. */
305 
306   /* Version 3. */
307   /* Version 3 moves m_Isolate and m_v8EmbedderSlot to FPDF_LIBRARY_CONFIG. */
308 
309 } IPDF_JSPLATFORM;
310 
311 // Flags for Cursor type
312 #define FXCT_ARROW 0
313 #define FXCT_NESW 1
314 #define FXCT_NWSE 2
315 #define FXCT_VBEAM 3
316 #define FXCT_HBEAM 4
317 #define FXCT_HAND 5
318 
319 /**
320  * Declares of a pointer type to the callback function for the FFI_SetTimer
321  *method.
322  * Parameters:
323  *          idEvent     -   Identifier of the timer.
324  * Return value:
325  *          None.
326  **/
327 typedef void (*TimerCallback)(int idEvent);
328 
329 /**
330  * Declares of a struct type to the local system time.
331 **/
332 typedef struct _FPDF_SYSTEMTIME {
333   unsigned short wYear;         /* years since 1900 */
334   unsigned short wMonth;        /* months since January - [0,11] */
335   unsigned short wDayOfWeek;    /* days since Sunday - [0,6] */
336   unsigned short wDay;          /* day of the month - [1,31] */
337   unsigned short wHour;         /* hours since midnight - [0,23] */
338   unsigned short wMinute;       /* minutes after the hour - [0,59] */
339   unsigned short wSecond;       /* seconds after the minute - [0,59] */
340   unsigned short wMilliseconds; /* milliseconds after the second - [0,999] */
341 } FPDF_SYSTEMTIME;
342 
343 #ifdef PDF_ENABLE_XFA
344 // XFA
345 /**
346  * @name Pageview  event flags
347  */
348 /*@{*/
349 /** @brief After a new pageview is added. */
350 #define FXFA_PAGEVIEWEVENT_POSTADDED 1
351 /** @brief After a pageview is removed. */
352 #define FXFA_PAGEVIEWEVENT_POSTREMOVED 3
353 /*@}*/
354 
355 // menu
356 /**
357  * @name Macro Definitions for Right Context Menu Features Of XFA Fields
358  */
359 /*@{*/
360 #define FXFA_MEMU_COPY 1
361 #define FXFA_MEMU_CUT 2
362 #define FXFA_MEMU_SELECTALL 4
363 #define FXFA_MEMU_UNDO 8
364 #define FXFA_MEMU_REDO 16
365 #define FXFA_MEMU_PASTE 32
366 /*@}*/
367 
368 // file type
369 /**
370  * @name Macro Definitions for File Type.
371  */
372 /*@{*/
373 #define FXFA_SAVEAS_XML 1
374 #define FXFA_SAVEAS_XDP 2
375 /*@}*/
376 #endif  // PDF_ENABLE_XFA
377 
378 typedef struct _FPDF_FORMFILLINFO {
379   /**
380    * Version number of the interface. Currently must be 1 (when PDFium is built
381    *  without the XFA module) or must be 2 (when built with the XFA module).
382    **/
383   int version;
384 
385   /* Version 1. */
386   /**
387    *Method: Release
388    *         Give implementation a chance to release any data after the
389    *         interface is no longer used
390    *Interface Version:
391    *         1
392    *Implementation Required:
393    *         No
394    *Comments:
395    *         Called by Foxit SDK during the final cleanup process.
396    *Parameters:
397    *         pThis       -   Pointer to the interface structure itself
398    *Return Value:
399    *         None
400    */
401   void (*Release)(struct _FPDF_FORMFILLINFO* pThis);
402 
403   /**
404    * Method: FFI_Invalidate
405    *          Invalidate the client area within the specified rectangle.
406    * Interface Version:
407    *          1
408    * Implementation Required:
409       *           yes
410    * Parameters:
411    *          pThis       -   Pointer to the interface structure itself.
412    *          page        -   Handle to the page. Returned by FPDF_LoadPage
413    *function.
414    *          left        -   Left position of the client area in PDF page
415    *coordinate.
416    *          top         -   Top  position of the client area in PDF page
417    *coordinate.
418    *          right       -   Right position of the client area in PDF page
419    *coordinate.
420    *          bottom      -   Bottom position of the client area in PDF page
421    *coordinate.
422    * Return Value:
423    *          None.
424    *
425    *comments:
426    *          All positions are measured in PDF "user space".
427    *          Implementation should call FPDF_RenderPageBitmap() function for
428    *repainting a specified page area.
429   */
430   void (*FFI_Invalidate)(struct _FPDF_FORMFILLINFO* pThis,
431                          FPDF_PAGE page,
432                          double left,
433                          double top,
434                          double right,
435                          double bottom);
436 
437   /**
438    * Method: FFI_OutputSelectedRect
439    *          When user is taking the mouse to select texts on a form field,
440    * this callback function will keep
441    *          returning the selected areas to the implementation.
442    *
443    * Interface Version:
444    *          1
445    * Implementation Required:
446    *          No
447    * Parameters:
448    *          pThis       -   Pointer to the interface structure itself.
449    *          page        -   Handle to the page. Returned by FPDF_LoadPage
450    * function.
451    *          left        -   Left position of the client area in PDF page
452    * coordinate.
453    *          top         -   Top  position of the client area in PDF page
454    * coordinate.
455    *          right       -   Right position of the client area in PDF page
456    * coordinate.
457    *          bottom      -   Bottom position of the client area in PDF page
458    * coordinate.
459    * Return Value:
460    *          None.
461    *
462    * comments:
463    *          This CALLBACK function is useful for implementing special text
464    * selection effect. Implementation should
465    *          first records the returned rectangles, then draw them one by one
466    * at the painting period, last,remove all
467    *          the recorded rectangles when finish painting.
468   */
469   void (*FFI_OutputSelectedRect)(struct _FPDF_FORMFILLINFO* pThis,
470                                  FPDF_PAGE page,
471                                  double left,
472                                  double top,
473                                  double right,
474                                  double bottom);
475 
476   /**
477   * Method: FFI_SetCursor
478   *           Set the Cursor shape.
479   * Interface Version:
480   *           1
481   * Implementation Required:
482   *           yes
483   * Parameters:
484   *       pThis       -   Pointer to the interface structure itself.
485   *       nCursorType -   Cursor type. see Flags for Cursor type for the
486   * details.
487   *   Return value:
488   *       None.
489   * */
490   void (*FFI_SetCursor)(struct _FPDF_FORMFILLINFO* pThis, int nCursorType);
491 
492   /**
493   * Method: FFI_SetTimer
494   *           This method installs a system timer. A time-out value is
495   * specified,
496   *           and every time a time-out occurs, the system passes a message to
497   *           the TimerProc callback function.
498   * Interface Version:
499   *           1
500   * Implementation Required:
501   *           yes
502   * Parameters:
503   *       pThis       -   Pointer to the interface structure itself.
504   *       uElapse     -   Specifies the time-out value, in milliseconds.
505   *       lpTimerFunc -   A pointer to the callback function-TimerCallback.
506   *   Return value:
507   *       The timer identifier of the new timer if the function is successful.
508   *       An application passes this value to the FFI_KillTimer method to kill
509   *       the timer. Nonzero if it is successful; otherwise, it is zero.
510   * */
511   int (*FFI_SetTimer)(struct _FPDF_FORMFILLINFO* pThis,
512                       int uElapse,
513                       TimerCallback lpTimerFunc);
514 
515   /**
516   * Method: FFI_KillTimer
517   *           This method kills the timer event identified by nIDEvent, set by
518   * an earlier call to FFI_SetTimer.
519   * Interface Version:
520   *           1
521   * Implementation Required:
522   *           yes
523   * Parameters:
524   *       pThis       -   Pointer to the interface structure itself.
525   *       nTimerID    -   The timer ID return by FFI_SetTimer function.
526   *   Return value:
527   *       None.
528   * */
529   void (*FFI_KillTimer)(struct _FPDF_FORMFILLINFO* pThis, int nTimerID);
530 
531   /**
532   * Method: FFI_GetLocalTime
533   *           This method receives the current local time on the system.
534   * Interface Version:
535   *           1
536   * Implementation Required:
537   *           yes
538   * Parameters:
539   *       pThis       -   Pointer to the interface structure itself.
540   *   Return value:
541   *       None.
542   * */
543   FPDF_SYSTEMTIME (*FFI_GetLocalTime)(struct _FPDF_FORMFILLINFO* pThis);
544 
545   /**
546   * Method: FFI_OnChange
547   *           This method will be invoked to notify implementation when the
548   * value of any FormField on the document had been changed.
549   * Interface Version:
550   *           1
551   * Implementation Required:
552   *           no
553   * Parameters:
554   *       pThis       -   Pointer to the interface structure itself.
555   *   Return value:
556   *       None.
557   * */
558   void (*FFI_OnChange)(struct _FPDF_FORMFILLINFO* pThis);
559 
560   /**
561   * Method: FFI_GetPage
562   *           This method receives the page pointer associated with a specified
563   * page index.
564   * Interface Version:
565   *           1
566   * Implementation Required:
567   *           yes
568   * Parameters:
569   *       pThis       -   Pointer to the interface structure itself.
570   *       document    -   Handle to document. Returned by FPDF_LoadDocument
571   * function.
572   *       nPageIndex  -   Index number of the page. 0 for the first page.
573   * Return value:
574   *       Handle to the page. Returned by FPDF_LoadPage function.
575   * Comments:
576   *       In some cases, the document-level JavaScript action may refer to a
577   * page which hadn't been loaded yet.
578   *       To successfully run the javascript action, implementation need to load
579   * the page for SDK.
580   * */
581   FPDF_PAGE   (*FFI_GetPage)(struct _FPDF_FORMFILLINFO* pThis, FPDF_DOCUMENT document, int nPageIndex);
582 
583   /**
584   * Method: FFI_GetCurrentPage
585   *       This method receives the current page pointer.
586   * Interface Version:
587   *           1
588   * Implementation Required:
589   *           yes
590   * Parameters:
591   *       pThis       -   Pointer to the interface structure itself.
592   *       document    -   Handle to document. Returned by FPDF_LoadDocument
593   * function.
594   * Return value:
595   *       Handle to the page. Returned by FPDF_LoadPage function.
596   * */
597   FPDF_PAGE   (*FFI_GetCurrentPage)(struct _FPDF_FORMFILLINFO* pThis, FPDF_DOCUMENT document);
598 
599   /**
600   * Method: FFI_GetRotation
601   *           This method receives currently rotation of the page view.
602   * Interface Version:
603   *           1
604   * Implementation Required:
605   *           yes
606   * Parameters:
607   *       pThis       -   Pointer to the interface structure itself.
608   *       page        -   Handle to page. Returned by FPDF_LoadPage function.
609   * Return value:
610   *       The page rotation. Should be 0(0 degree),1(90 degree),2(180
611   * degree),3(270 degree), in a clockwise direction.
612   * */
613   int (*FFI_GetRotation)(struct _FPDF_FORMFILLINFO* pThis, FPDF_PAGE page);
614 
615   /**
616   * Method: FFI_ExecuteNamedAction
617   *           This method will execute an named action.
618   * Interface Version:
619   *           1
620   * Implementation Required:
621   *           yes
622   * Parameters:
623   *       pThis           -   Pointer to the interface structure itself.
624   *       namedAction     -   A byte string which indicates the named action,
625   * terminated by 0.
626   * Return value:
627   *       None.
628   * Comments:
629   *       See the named actions description of <<PDF Reference, version 1.7>>
630   * for more details.
631   * */
632   void (*FFI_ExecuteNamedAction)(struct _FPDF_FORMFILLINFO* pThis,
633                                  FPDF_BYTESTRING namedAction);
634   /**
635   * @brief This method will be called when a text field is getting or losing a
636   * focus.
637   *
638   * @param[in] pThis      Pointer to the interface structure itself.
639   * @param[in] value      The string value of the form field, in UTF-16LE
640   * format.
641   * @param[in] valueLen   The length of the string value, number of characters
642   * (not bytes).
643   * @param[in] is_focus   True if the form field is getting a focus, False for
644   * losing a focus.
645   *
646   * @return None.
647   *
648   * @note Currently,only support text field and combobox field.
649   * */
650   void (*FFI_SetTextFieldFocus)(struct _FPDF_FORMFILLINFO* pThis,
651                                 FPDF_WIDESTRING value,
652                                 FPDF_DWORD valueLen,
653                                 FPDF_BOOL is_focus);
654 
655   /**
656   * Method: FFI_DoURIAction
657   *           This action resolves to a uniform resource identifier.
658   * Interface Version:
659   *           1
660   * Implementation Required:
661   *           No
662   * Parameters:
663   *       pThis           -   Pointer to the interface structure itself.
664   *       bsURI           -   A byte string which indicates the uniform resource
665   * identifier, terminated by 0.
666   * Return value:
667   *       None.
668   * Comments:
669   *       See the URI actions description of <<PDF Reference, version 1.7>> for
670   * more details.
671   * */
672   void (*FFI_DoURIAction)(struct _FPDF_FORMFILLINFO* pThis,
673                           FPDF_BYTESTRING bsURI);
674 
675   /**
676   * Method: FFI_DoGoToAction
677   *           This action changes the view to a specified destination.
678   * Interface Version:
679   *           1
680   * Implementation Required:
681   *           No
682   * Parameters:
683   *       pThis           -   Pointer to the interface structure itself.
684   *       nPageIndex      -   The index of the PDF page.
685   *       zoomMode        -   The zoom mode for viewing page.See Macros
686   *"PDFZOOM_XXX" defined in "fpdfdoc.h".
687   *       fPosArray       -   The float array which carries the position info.
688   *       sizeofArray     -   The size of float array.
689   * Return value:
690   *       None.
691   * Comments:
692   *       See the Destinations description of <<PDF Reference, version 1.7>> in
693   *8.2.1 for more details.
694   **/
695   void (*FFI_DoGoToAction)(struct _FPDF_FORMFILLINFO* pThis,
696                            int nPageIndex,
697                            int zoomMode,
698                            float* fPosArray,
699                            int sizeofArray);
700 
701   /**
702   *   pointer to IPDF_JSPLATFORM interface
703   **/
704   IPDF_JSPLATFORM* m_pJsPlatform;
705 
706 #ifdef PDF_ENABLE_XFA
707   /* Version 2. */
708   /**
709     * Method: FFI_DisplayCaret
710     *           This method will show the caret at specified position.
711     * Interface Version:
712     *           1
713     * Implementation Required:
714     *           yes
715     * Parameters:
716     *       pThis           -   Pointer to the interface structure itself.
717     *       page            -   Handle to page. Returned by FPDF_LoadPage
718     *function.
719     *       left            -   Left position of the client area in PDF page
720     *coordinate.
721     *       top             -   Top position of the client area in PDF page
722     *coordinate.
723     *       right           -   Right position of the client area in PDF page
724     *coordinate.
725     *       bottom          -   Bottom position of the client area in PDF page
726     *coordinate.
727     * Return value:
728     *       None.
729     **/
730   void (*FFI_DisplayCaret)(struct _FPDF_FORMFILLINFO* pThis,
731                            FPDF_PAGE page,
732                            FPDF_BOOL bVisible,
733                            double left,
734                            double top,
735                            double right,
736                            double bottom);
737 
738   /**
739   * Method: FFI_GetCurrentPageIndex
740   *           This method will get the current page index.
741   * Interface Version:
742   *           1
743   * Implementation Required:
744   *           yes
745   * Parameters:
746   *       pThis           -   Pointer to the interface structure itself.
747   *       document        -   Handle to document. Returned by FPDF_LoadDocument
748   *function.
749   * Return value:
750   *       The index of current page.
751   **/
752   int (*FFI_GetCurrentPageIndex)(struct _FPDF_FORMFILLINFO* pThis,
753                                  FPDF_DOCUMENT document);
754 
755   /**
756   * Method: FFI_SetCurrentPage
757   *           This method will set the current page.
758   * Interface Version:
759   *           1
760   * Implementation Required:
761   *           yes
762   * Parameters:
763   *       pThis           -   Pointer to the interface structure itself.
764   *       document        -   Handle to document. Returned by FPDF_LoadDocument
765   *function.
766   *       iCurPage        -   The index of the PDF page.
767   * Return value:
768   *       None.
769   **/
770   void (*FFI_SetCurrentPage)(struct _FPDF_FORMFILLINFO* pThis,
771                              FPDF_DOCUMENT document,
772                              int iCurPage);
773 
774   /**
775   * Method: FFI_GotoURL
776   *           This method will link to the specified URL.
777   * Interface Version:
778   *           1
779   * Implementation Required:
780   *           no
781   * Parameters:
782   *       pThis           -   Pointer to the interface structure itself.
783   *       document        -   Handle to document. Returned by FPDF_LoadDocument
784   *function.
785   *       wsURL           -   The string value of the URL, in UTF-16LE format.
786   * Return value:
787   *       None.
788   **/
789   void (*FFI_GotoURL)(struct _FPDF_FORMFILLINFO* pThis,
790                       FPDF_DOCUMENT document,
791                       FPDF_WIDESTRING wsURL);
792 
793   /**
794   * Method: FFI_GetPageViewRect
795   *           This method will get the current page view rectangle.
796   * Interface Version:
797   *           1
798   * Implementation Required:
799   *           yes
800   * Parameters:
801   *       pThis           -   Pointer to the interface structure itself.
802   *       page            -   Handle to page. Returned by FPDF_LoadPage
803   *function.
804   *       left            -   The pointer to receive left position of the page
805   *view area in PDF page coordinate.
806   *       top             -   The pointer to receive top position of the page
807   *view area in PDF page coordinate.
808   *       right           -   The pointer to receive right position of the
809   *client area in PDF page coordinate.
810   *       bottom          -   The pointer to receive bottom position of the
811   *client area in PDF page coordinate.
812   * Return value:
813   *       None.
814   **/
815   void (*FFI_GetPageViewRect)(struct _FPDF_FORMFILLINFO* pThis,
816                               FPDF_PAGE page,
817                               double* left,
818                               double* top,
819                               double* right,
820                               double* bottom);
821   /**
822   * Method: FFI_PopupMenu
823   *           This method will track the right context menu for XFA fields.
824   * Interface Version:
825   *           1
826   * Implementation Required:
827   *           yes
828   * Parameters:
829   *       pThis           -   Pointer to the interface structure itself.
830   *       page            -   Handle to page. Returned by FPDF_LoadPage
831   *function.
832   *       hWidget         -   Handle to XFA fields.
833   *       menuFlag        -   The menu flags. Please refer to macro definition
834   *of FXFA_MEMU_XXX and this can be one or a combination of these macros.
835   *       x               -   X position of the client area in PDF page
836   *coordinate.
837   *       y               -   Y position of the client area in PDF page
838   *coordinate.
839   * Return value:
840   *       TRUE indicates success; otherwise false.
841   **/
842   FPDF_BOOL (*FFI_PopupMenu)(struct _FPDF_FORMFILLINFO* pThis, FPDF_PAGE page, FPDF_WIDGET hWidget, int menuFlag, float x, float y);
843 
844   /**
845   * Method: FFI_OpenFile
846   *           This method will open the specified file with the specified mode.
847   * Interface Version
848   *           1
849   * Implementation Required:
850   *           yes
851   * Parameters:
852   *       pThis           -   Pointer to the interface structure itself.
853   *       fileFlag        -   The file flag.Please refer to macro definition of
854   *FXFA_SAVEAS_XXX and this can be one of these macros.
855   *       wsURL           -   The string value of the file URL, in UTF-16LE
856   *format.
857   *       mode            -   The mode for open file.
858   * Return value:
859   *       The handle to FPDF_FILEHANDLER.
860   **/
861   FPDF_FILEHANDLER* (*FFI_OpenFile)(struct _FPDF_FORMFILLINFO* pThis,
862                                     int fileFlag,
863                                     FPDF_WIDESTRING wsURL,
864                                     const char* mode);
865 
866   /**
867   * Method: FFI_EmailTo
868   *           This method will email the specified file stream to the specified
869   *contacter.
870   * Interface Version:
871   *           1
872   * Implementation Required:
873   *           yes
874   * Parameters:
875   *       pThis           -   Pointer to the interface structure itself.
876   *       pFileHandler    -   Handle to the FPDF_FILEHANDLER.
877   *       pTo             -   A semicolon-delimited list of recipients for the
878   *message,in UTF-16LE format.
879   *       pSubject        -   The subject of the message,in UTF-16LE format.
880   *       pCC             -   A semicolon-delimited list of CC recipients for
881   *the message,in UTF-16LE format.
882   *       pBcc            -   A semicolon-delimited list of BCC recipients for
883   *the message,in UTF-16LE format.
884   *       pMsg            -   Pointer to the data buffer to be sent.Can be
885   *NULL,in UTF-16LE format.
886   * Return value:
887   *       None.
888   **/
889   void (*FFI_EmailTo)(struct _FPDF_FORMFILLINFO* pThis,
890                       FPDF_FILEHANDLER* fileHandler,
891                       FPDF_WIDESTRING pTo,
892                       FPDF_WIDESTRING pSubject,
893                       FPDF_WIDESTRING pCC,
894                       FPDF_WIDESTRING pBcc,
895                       FPDF_WIDESTRING pMsg);
896 
897   /**
898   * Method: FFI_UploadTo
899   *           This method will get upload the specified file stream to the
900   *specified URL.
901   * Interface Version:
902   *           1
903   * Implementation Required:
904   *           yes
905   * Parameters:
906   *       pThis           -   Pointer to the interface structure itself.
907   *       pFileHandler    -   Handle to the FPDF_FILEHANDLER.
908   *       fileFlag        -   The file flag.Please refer to macro definition of
909   *FXFA_SAVEAS_XXX and this can be one of these macros.
910   *       uploadTo        -   Pointer to the URL path, in UTF-16LE format.
911   * Return value:
912   *       None.
913   **/
914   void (*FFI_UploadTo)(struct _FPDF_FORMFILLINFO* pThis,
915                        FPDF_FILEHANDLER* fileHandler,
916                        int fileFlag,
917                        FPDF_WIDESTRING uploadTo);
918 
919   /**
920   * Method: FFI_GetPlatform
921   *           This method will get the current platform.
922   * Interface Version:
923   *           1
924   * Implementation Required:
925   *           yes
926   * Parameters:
927   *       pThis           -   Pointer to the interface structure itself.
928   *       platform        -   Pointer to the data buffer to receive the
929   *platform.Can be NULL,in UTF-16LE format.
930   *       length          -   The length of the buffer, number of bytes. Can be
931   *0.
932   * Return value:
933   *       The length of the buffer, number of bytes.
934   **/
935   int (*FFI_GetPlatform)(struct _FPDF_FORMFILLINFO* pThis,
936                          void* platform,
937                          int length);
938 
939   /**
940   * Method: FFI_GetLanguage
941   *           This method will get the current language.
942   * Interface Version:
943   *           1
944   * Implementation Required:
945   *           yes
946   * Parameters:
947   *       pThis           -   Pointer to the interface structure itself.
948   *       language        -   Pointer to the data buffer to receive the current
949   *language.Can be NULL.
950   *       length          -   The length of the buffer, number of bytes. Can be
951   *0.
952   * Return value:
953   *       The length of the buffer, number of bytes.
954   **/
955   int (*FFI_GetLanguage)(struct _FPDF_FORMFILLINFO* pThis,
956                          void* language,
957                          int length);
958 
959   /**
960   * Method: FFI_DownloadFromURL
961   *           This method will download the specified file from the URL.
962   * Interface Version:
963   *           1
964   * Implementation Required:
965   *           yes
966   * Parameters:
967   *       pThis           -   Pointer to the interface structure itself.
968   *       URL             -   The string value of the file URL, in UTF-16LE
969   *format.
970   * Return value:
971   *       The handle to FPDF_FILEHANDLER.
972   **/
973   FPDF_LPFILEHANDLER  (*FFI_DownloadFromURL)(struct _FPDF_FORMFILLINFO* pThis, FPDF_WIDESTRING URL);
974   /**
975   * Method: FFI_PostRequestURL
976   *           This method will post the request to the server URL.
977   * Interface Version:
978   *           1
979   * Implementation Required:
980   *           yes
981   * Parameters:
982   *       pThis           -   Pointer to the interface structure itself.
983   *       wsURL           -   The string value of the server URL, in UTF-16LE
984   *format.
985   *       wsData          -   The post data,in UTF-16LE format.
986   *       wsContentType   -   The content type of the request data,in UTF-16LE
987   *format.
988   *       wsEncode        -   The encode type,in UTF-16LE format.
989   *       wsHeader        -   The request header,in UTF-16LE format.
990   *       response        -   Pointer to the FPDF_BSTR to receive the response
991   *data from server,,in UTF-16LE format.
992   * Return value:
993   *       TRUE indicates success, otherwise FALSE.
994   **/
995   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* respone);
996 
997   /**
998   * Method: FFI_PutRequestURL
999   *           This method will put the request to the server URL.
1000   * Interface Version:
1001   *           1
1002   * Implementation Required:
1003   *           yes
1004   * Parameters:
1005   *       pThis           -   Pointer to the interface structure itself.
1006   *       wsURL           -   The string value of the server URL, in UTF-16LE
1007   *format.
1008   *       wsData          -   The put data, in UTF-16LE format.
1009   *       wsEncode        -   The encode type, in UTR-16LE format.
1010   * Return value:
1011   *       TRUE indicates success, otherwise FALSE.
1012   **/
1013   FPDF_BOOL   (*FFI_PutRequestURL)(struct _FPDF_FORMFILLINFO* pThis, FPDF_WIDESTRING wsURL, FPDF_WIDESTRING wsData, FPDF_WIDESTRING wsEncode);
1014 #endif  // PDF_ENABLE_XFA
1015 
1016 } FPDF_FORMFILLINFO;
1017 
1018 /**
1019  * Function: FPDFDOC_InitFormFillEnvironment
1020  *          Init form fill environment.
1021  * Comments:
1022  *          This function should be called before any form fill operation.
1023  * Parameters:
1024  *          document        -   Handle to document. Returned by
1025  *FPDF_LoadDocument function.
1026  *          pFormFillInfo   -   Pointer to a FPDF_FORMFILLINFO structure.
1027  * Return Value:
1028  *          Return handler to the form fill module. NULL means fails.
1029  **/
1030 DLLEXPORT FPDF_FORMHANDLE STDCALL
1031 FPDFDOC_InitFormFillEnvironment(FPDF_DOCUMENT document,
1032                                 FPDF_FORMFILLINFO* formInfo);
1033 
1034 /**
1035  * Function: FPDFDOC_ExitFormFillEnvironment
1036  *          Exit form fill environment.
1037  * Parameters:
1038  *          hHandle     -   Handle to the form fill module. Returned by
1039  *FPDFDOC_InitFormFillEnvironment.
1040  * Return Value:
1041  *          NULL.
1042  **/
1043 DLLEXPORT void STDCALL FPDFDOC_ExitFormFillEnvironment(FPDF_FORMHANDLE hHandle);
1044 
1045 /**
1046  * Function: FORM_OnAfterLoadPage
1047  *          This method is required for implementing all the form related
1048  *functions. Should be invoked after user
1049  *          successfully loaded a PDF page, and method
1050  *FPDFDOC_InitFormFillEnvironment had been invoked.
1051  * Parameters:
1052  *          hHandle     -   Handle to the form fill module. Returned by
1053  *FPDFDOC_InitFormFillEnvironment.
1054  * Return Value:
1055  *          NONE.
1056  **/
1057 DLLEXPORT void STDCALL FORM_OnAfterLoadPage(FPDF_PAGE page,
1058                                             FPDF_FORMHANDLE hHandle);
1059 
1060 /**
1061  * Function: FORM_OnBeforeClosePage
1062  *          This method is required for implementing all the form related
1063  *functions. Should be invoked before user
1064  *          close the PDF page.
1065  * Parameters:
1066  *          page        -   Handle to the page. Returned by FPDF_LoadPage
1067  *function.
1068  *          hHandle     -   Handle to the form fill module. Returned by
1069  *FPDFDOC_InitFormFillEnvironment.
1070  * Return Value:
1071  *          NONE.
1072  **/
1073 DLLEXPORT void STDCALL FORM_OnBeforeClosePage(FPDF_PAGE page,
1074                                               FPDF_FORMHANDLE hHandle);
1075 
1076 /**
1077 * Function: FORM_DoDocumentJSAction
1078 *           This method is required for performing Document-level JavaScript
1079 *action. It should be invoked after the PDF document
1080 *           had been loaded.
1081 * Parameters:
1082 *           hHandle     -   Handle to the form fill module. Returned by
1083 *FPDFDOC_InitFormFillEnvironment.
1084 * Return Value:
1085 *           NONE
1086 * Comments:
1087 *           If there is Document-level JavaScript action embedded in the
1088 *document, this method will execute the javascript action;
1089 *           otherwise, the method will do nothing.
1090 **/
1091 DLLEXPORT void STDCALL FORM_DoDocumentJSAction(FPDF_FORMHANDLE hHandle);
1092 
1093 /**
1094 * Function: FORM_DoDocumentOpenAction
1095 *           This method is required for performing open-action when the document
1096 *is opened.
1097 * Parameters:
1098 *           hHandle     -   Handle to the form fill module. Returned by
1099 *FPDFDOC_InitFormFillEnvironment.
1100 * Return Value:
1101 *           NONE
1102 * Comments:
1103 *           This method will do nothing if there is no open-actions embedded in
1104 *the document.
1105 **/
1106 DLLEXPORT void STDCALL FORM_DoDocumentOpenAction(FPDF_FORMHANDLE hHandle);
1107 
1108 // additional actions type of document.
1109 #define FPDFDOC_AACTION_WC \
1110   0x10  // WC, before closing document, JavaScript action.
1111 #define FPDFDOC_AACTION_WS \
1112   0x11  // WS, before saving document, JavaScript action.
1113 #define FPDFDOC_AACTION_DS 0x12  // DS, after saving document, JavaScript
1114                                  // action.
1115 #define FPDFDOC_AACTION_WP \
1116   0x13  // WP, before printing document, JavaScript action.
1117 #define FPDFDOC_AACTION_DP \
1118   0x14  // DP, after printing document, JavaScript action.
1119 
1120 /**
1121 * Function: FORM_DoDocumentAAction
1122 *           This method is required for performing the document's
1123 *additional-action.
1124 * Parameters:
1125 *           hHandle     -   Handle to the form fill module. Returned by
1126 *FPDFDOC_InitFormFillEnvironment.
1127 *           aaType      -   The type of the additional-actions which defined
1128 *above.
1129 * Return Value:
1130 *           NONE
1131 * Comments:
1132 *           This method will do nothing if there is no document
1133 *additional-action corresponding to the specified aaType.
1134 **/
1135 
1136 DLLEXPORT void STDCALL FORM_DoDocumentAAction(FPDF_FORMHANDLE hHandle,
1137                                               int aaType);
1138 
1139 // Additional-action types of page object
1140 #define FPDFPAGE_AACTION_OPEN \
1141   0  // /O -- An action to be performed when the page is opened
1142 #define FPDFPAGE_AACTION_CLOSE \
1143   1  // /C -- An action to be performed when the page is closed
1144 
1145 /**
1146 * Function: FORM_DoPageAAction
1147 *           This method is required for performing the page object's
1148 *additional-action when opened or closed.
1149 * Parameters:
1150 *           page        -   Handle to the page. Returned by FPDF_LoadPage
1151 *function.
1152 *           hHandle     -   Handle to the form fill module. Returned by
1153 *FPDFDOC_InitFormFillEnvironment.
1154 *           aaType      -   The type of the page object's additional-actions
1155 *which defined above.
1156 * Return Value:
1157 *           NONE
1158 * Comments:
1159 *           This method will do nothing if no additional-action corresponding to
1160 *the specified aaType exists.
1161 **/
1162 DLLEXPORT void STDCALL FORM_DoPageAAction(FPDF_PAGE page,
1163                                           FPDF_FORMHANDLE hHandle,
1164                                           int aaType);
1165 
1166 /**
1167  * Function: FORM_OnMouseMove
1168  *          You can call this member function when the mouse cursor moves.
1169  * Parameters:
1170  *          hHandle     -   Handle to the form fill module. Returned by
1171  *FPDFDOC_InitFormFillEnvironment.
1172  *          page        -   Handle to the page. Returned by FPDF_LoadPage
1173  *function.
1174  *          modifier        -   Indicates whether various virtual keys are down.
1175  *          page_x      -   Specifies the x-coordinate of the cursor in PDF user
1176  *space.
1177  *          page_y      -   Specifies the y-coordinate of the cursor in PDF user
1178  *space.
1179  * Return Value:
1180  *          TRUE indicates success; otherwise false.
1181  **/
1182 DLLEXPORT FPDF_BOOL STDCALL FORM_OnMouseMove(FPDF_FORMHANDLE hHandle,
1183                                              FPDF_PAGE page,
1184                                              int modifier,
1185                                              double page_x,
1186                                              double page_y);
1187 
1188 /**
1189  * Function: FORM_OnLButtonDown
1190  *          You can call this member function when the user presses the left
1191  *mouse button.
1192  * Parameters:
1193  *          hHandle     -   Handle to the form fill module. Returned by
1194  *FPDFDOC_InitFormFillEnvironment.
1195  *          page        -   Handle to the page. Returned by FPDF_LoadPage
1196  *function.
1197  *          modifier        -   Indicates whether various virtual keys are down.
1198  *          page_x      -   Specifies the x-coordinate of the cursor in PDF user
1199  *space.
1200  *          page_y      -   Specifies the y-coordinate of the cursor in PDF user
1201  *space.
1202  * Return Value:
1203  *          TRUE indicates success; otherwise false.
1204  **/
1205 DLLEXPORT FPDF_BOOL STDCALL FORM_OnLButtonDown(FPDF_FORMHANDLE hHandle,
1206                                                FPDF_PAGE page,
1207                                                int modifier,
1208                                                double page_x,
1209                                                double page_y);
1210 
1211 /**
1212  * Function: FORM_OnLButtonUp
1213  *          You can call this member function when the user releases the left
1214  *mouse button.
1215  * Parameters:
1216  *          hHandle     -   Handle to the form fill module. Returned by
1217  *FPDFDOC_InitFormFillEnvironment.
1218  *          page        -   Handle to the page. Returned by FPDF_LoadPage
1219  *function.
1220  *          modifier    -   Indicates whether various virtual keys are down.
1221  *          page_x      -   Specifies the x-coordinate of the cursor in device.
1222  *          page_y      -   Specifies the y-coordinate of the cursor in device.
1223  * Return Value:
1224  *          TRUE indicates success; otherwise false.
1225  **/
1226 DLLEXPORT FPDF_BOOL STDCALL FORM_OnLButtonUp(FPDF_FORMHANDLE hHandle,
1227                                              FPDF_PAGE page,
1228                                              int modifier,
1229                                              double page_x,
1230                                              double page_y);
1231 
1232 #ifdef PDF_ENABLE_XFA
1233 DLLEXPORT FPDF_BOOL STDCALL FORM_OnRButtonDown(FPDF_FORMHANDLE hHandle,
1234                                                FPDF_PAGE page,
1235                                                int modifier,
1236                                                double page_x,
1237                                                double page_y);
1238 DLLEXPORT FPDF_BOOL STDCALL FORM_OnRButtonUp(FPDF_FORMHANDLE hHandle,
1239                                              FPDF_PAGE page,
1240                                              int modifier,
1241                                              double page_x,
1242                                              double page_y);
1243 #endif  // PDF_ENABLE_XFA
1244 
1245 /**
1246  * Function: FORM_OnKeyDown
1247  *          You can call this member function when a nonsystem key is pressed.
1248  * Parameters:
1249  *          hHandle     -   Handle to the form fill module. Returned by
1250  *FPDFDOC_InitFormFillEnvironment.
1251  *          page        -   Handle to the page. Returned by FPDF_LoadPage
1252  *function.
1253  *          nKeyCode    -   Indicates whether various virtual keys are down.
1254  *          modifier    -   Contains the scan code, key-transition code,
1255  *previous key state, and context code.
1256  * Return Value:
1257  *          TRUE indicates success; otherwise false.
1258  **/
1259 DLLEXPORT FPDF_BOOL STDCALL FORM_OnKeyDown(FPDF_FORMHANDLE hHandle,
1260                                            FPDF_PAGE page,
1261                                            int nKeyCode,
1262                                            int modifier);
1263 
1264 /**
1265  * Function: FORM_OnKeyUp
1266  *          You can call this member function when a nonsystem key is released.
1267  * Parameters:
1268  *          hHandle     -   Handle to the form fill module. Returned by
1269  *FPDFDOC_InitFormFillEnvironment.
1270  *          page        -   Handle to the page. Returned by FPDF_LoadPage
1271  *function.
1272  *          nKeyCode    -   The virtual-key code of the given key.
1273  *          modifier    -   Contains the scan code, key-transition code,
1274  *previous key state, and context code.
1275  * Return Value:
1276  *          TRUE indicates success; otherwise false.
1277  **/
1278 DLLEXPORT FPDF_BOOL STDCALL FORM_OnKeyUp(FPDF_FORMHANDLE hHandle,
1279                                          FPDF_PAGE page,
1280                                          int nKeyCode,
1281                                          int modifier);
1282 
1283 /**
1284  * Function: FORM_OnChar
1285  *          You can call this member function when a keystroke translates to a
1286  *nonsystem character.
1287  * Parameters:
1288  *          hHandle     -   Handle to the form fill module. Returned by
1289  *FPDFDOC_InitFormFillEnvironment.
1290  *          page        -   Handle to the page. Returned by FPDF_LoadPage
1291  *function.
1292  *          nChar       -   The character code value of the key.
1293  *          modifier    -   Contains the scan code, key-transition code,
1294  *previous key state, and context code.
1295  * Return Value:
1296  *          TRUE indicates success; otherwise false.
1297  **/
1298 DLLEXPORT FPDF_BOOL STDCALL FORM_OnChar(FPDF_FORMHANDLE hHandle,
1299                                         FPDF_PAGE page,
1300                                         int nChar,
1301                                         int modifier);
1302 
1303 /**
1304  * Function: FORM_ForceToKillFocus.
1305  *          You can call this member function to force to kill the focus of the
1306  *form field which got focus.
1307  *          It would kill the focus on the form field, save the value of form
1308  *field if it's changed by user.
1309  * Parameters:
1310  *          hHandle     -   Handle to the form fill module. Returned by
1311  *FPDFDOC_InitFormFillEnvironment.
1312  * Return Value:
1313  *          TRUE indicates success; otherwise false.
1314  **/
1315 DLLEXPORT FPDF_BOOL STDCALL FORM_ForceToKillFocus(FPDF_FORMHANDLE hHandle);
1316 
1317 // Field Types
1318 #define FPDF_FORMFIELD_UNKNOWN 0      // Unknown.
1319 #define FPDF_FORMFIELD_PUSHBUTTON 1   // push button type.
1320 #define FPDF_FORMFIELD_CHECKBOX 2     // check box type.
1321 #define FPDF_FORMFIELD_RADIOBUTTON 3  // radio button type.
1322 #define FPDF_FORMFIELD_COMBOBOX 4     // combo box type.
1323 #define FPDF_FORMFIELD_LISTBOX 5      // list box type.
1324 #define FPDF_FORMFIELD_TEXTFIELD 6    // text field type.
1325 #ifdef PDF_ENABLE_XFA
1326 #define FPDF_FORMFIELD_XFA 7          // text field type.
1327 #endif  // PDF_ENABLE_XFA
1328 
1329 /**
1330  * Function: FPDFPage_HasFormFieldAtPoint
1331  *     Get the form field type by point.
1332  * Parameters:
1333  *     hHandle     -   Handle to the form fill module. Returned by
1334  *                     FPDFDOC_InitFormFillEnvironment().
1335  *     page        -   Handle to the page. Returned by FPDF_LoadPage().
1336  *     page_x      -   X position in PDF "user space".
1337  *     page_y      -   Y position in PDF "user space".
1338  * Return Value:
1339  *     Return the type of the form field; -1 indicates no field.
1340  *     See field types above.
1341  **/
1342 DLLEXPORT int STDCALL FPDFPage_HasFormFieldAtPoint(FPDF_FORMHANDLE hHandle,
1343                                                    FPDF_PAGE page,
1344                                                    double page_x,
1345                                                    double page_y);
1346 
1347 /**
1348  * Function: FPDPage_HasFormFieldAtPoint
1349  *     DEPRECATED. Please use FPDFPage_HasFormFieldAtPoint.
1350  **/
1351 DLLEXPORT int STDCALL FPDPage_HasFormFieldAtPoint(FPDF_FORMHANDLE hHandle,
1352                                                   FPDF_PAGE page,
1353                                                   double page_x,
1354                                                   double page_y);
1355 
1356 /**
1357  * Function: FPDFPage_FormFieldZOrderAtPoint
1358  *     Get the form field z-order by point.
1359  * Parameters:
1360  *     hHandle     -   Handle to the form fill module. Returned by
1361  *                     FPDFDOC_InitFormFillEnvironment().
1362  *     page        -   Handle to the page. Returned by FPDF_LoadPage().
1363  *     page_x      -   X position in PDF "user space".
1364  *     page_y      -   Y position in PDF "user space".
1365  * Return Value:
1366  *     Return the z-order of the form field; -1 indicates no field.
1367  *     Higher numbers are closer to the front.
1368  **/
1369 DLLEXPORT int STDCALL FPDFPage_FormFieldZOrderAtPoint(FPDF_FORMHANDLE hHandle,
1370                                                       FPDF_PAGE page,
1371                                                       double page_x,
1372                                                       double page_y);
1373 
1374 /**
1375  * Function: FPDF_SetFormFieldHighlightColor
1376  *          Set the highlight color of specified or all the form fields in the
1377  *document.
1378  * Parameters:
1379  *          hHandle     -   Handle to the form fill module. Returned by
1380  *FPDFDOC_InitFormFillEnvironment.
1381  *          doc         -   Handle to the document. Returned by
1382  *FPDF_LoadDocument function.
1383  *          fieldType   -   A 32-bit integer indicating the type of a form
1384  *field(defined above).
1385  *          color       -   The highlight color of the form field.Constructed by
1386  *0xxxrrggbb.
1387  * Return Value:
1388  *          NONE.
1389  * Comments:
1390  *          When the parameter fieldType is set to zero, the highlight color
1391  *will be applied to all the form fields in the
1392  *          document.
1393  *          Please refresh the client window to show the highlight immediately
1394  *if necessary.
1395  **/
1396 DLLEXPORT void STDCALL FPDF_SetFormFieldHighlightColor(FPDF_FORMHANDLE hHandle,
1397                                                        int fieldType,
1398                                                        unsigned long color);
1399 
1400 /**
1401  * Function: FPDF_SetFormFieldHighlightAlpha
1402  *          Set the transparency of the form field highlight color in the
1403  *document.
1404  * Parameters:
1405  *          hHandle     -   Handle to the form fill module. Returned by
1406  *FPDFDOC_InitFormFillEnvironment.
1407  *          doc         -   Handle to the document. Returned by
1408  *FPDF_LoadDocument function.
1409  *          alpha       -   The transparency of the form field highlight color.
1410  *between 0-255.
1411  * Return Value:
1412  *          NONE.
1413  **/
1414 DLLEXPORT void STDCALL FPDF_SetFormFieldHighlightAlpha(FPDF_FORMHANDLE hHandle,
1415                                                        unsigned char alpha);
1416 
1417 /**
1418  * Function: FPDF_RemoveFormFieldHighlight
1419  *          Remove the form field highlight color in the document.
1420  * Parameters:
1421  *          hHandle     -   Handle to the form fill module. Returned by
1422  *FPDFDOC_InitFormFillEnvironment.
1423  * Return Value:
1424  *          NONE.
1425  * Comments:
1426  *          Please refresh the client window to remove the highlight immediately
1427  *if necessary.
1428  **/
1429 DLLEXPORT void STDCALL FPDF_RemoveFormFieldHighlight(FPDF_FORMHANDLE hHandle);
1430 
1431 /**
1432 * Function: FPDF_FFLDraw
1433 *           Render FormFeilds on a page to a device independent bitmap.
1434 * Parameters:
1435 *           hHandle     -   Handle to the form fill module. Returned by
1436 *FPDFDOC_InitFormFillEnvironment.
1437 *           bitmap      -   Handle to the device independent bitmap (as the
1438 *output buffer).
1439 *                           Bitmap handle can be created by FPDFBitmap_Create
1440 *function.
1441 *           page        -   Handle to the page. Returned by FPDF_LoadPage
1442 *function.
1443 *           start_x     -   Left pixel position of the display area in the
1444 *device coordinate.
1445 *           start_y     -   Top pixel position of the display area in the device
1446 *coordinate.
1447 *           size_x      -   Horizontal size (in pixels) for displaying the page.
1448 *           size_y      -   Vertical size (in pixels) for displaying the page.
1449 *           rotate      -   Page orientation: 0 (normal), 1 (rotated 90 degrees
1450 *clockwise),
1451 *                               2 (rotated 180 degrees), 3 (rotated 90 degrees
1452 *counter-clockwise).
1453 *           flags       -   0 for normal display, or combination of flags
1454 *defined above.
1455 * Return Value:
1456 *           None.
1457 * Comments:
1458 *           This method is designed to only render annotations and FormFields on
1459 *the page.
1460 *           Without FPDF_ANNOT specified for flags, Rendering functions such as
1461 *FPDF_RenderPageBitmap or FPDF_RenderPageBitmap_Start will only render page
1462 *contents(without annotations) to a bitmap.
1463 *           In order to implement the FormFill functions,Implementation should
1464 *call this method after rendering functions finish rendering the page contents.
1465 **/
1466 DLLEXPORT void STDCALL FPDF_FFLDraw(FPDF_FORMHANDLE hHandle,
1467                                     FPDF_BITMAP bitmap,
1468                                     FPDF_PAGE page,
1469                                     int start_x,
1470                                     int start_y,
1471                                     int size_x,
1472                                     int size_y,
1473                                     int rotate,
1474                                     int flags);
1475 
1476 #ifdef PDF_ENABLE_XFA
1477 /**
1478  * Function: FPDF_HasXFAField
1479  *                      This method is designed to check whether a pdf document
1480  *has XFA fields.
1481  * Parameters:
1482  *                      document                -       Handle to document.
1483  *Returned by FPDF_LoadDocument function.
1484  *                      docType                 -       Document type defined as
1485  *DOCTYPE_xxx.
1486  * Return Value:
1487  *                      TRUE indicates that the input document has XFA fields,
1488  *otherwise FALSE.
1489  **/
1490 DLLEXPORT FPDF_BOOL STDCALL FPDF_HasXFAField(FPDF_DOCUMENT document,
1491                                              int* docType);
1492 
1493 /**
1494  * Function: FPDF_LoadXFA
1495  *          If the document consists of XFA fields, there should call this
1496  *method to load XFA fields.
1497  * Parameters:
1498  *          document        -   Handle to document. Returned by
1499  *FPDF_LoadDocument function.
1500  * Return Value:
1501  *          TRUE indicates success,otherwise FALSE.
1502  **/
1503 DLLEXPORT FPDF_BOOL STDCALL FPDF_LoadXFA(FPDF_DOCUMENT document);
1504 
1505 /**
1506  * Function: FPDF_Widget_Undo
1507  *          This method will implement the undo feature for the specified xfa
1508  *field.
1509  * Parameters:
1510  *          document        -   Handle to document. Returned by
1511  *FPDF_LoadDocument function.
1512  *          hWidget         -   Handle to the xfa field.
1513  * Return Value:
1514  *          None.
1515  **/
1516 DLLEXPORT void STDCALL FPDF_Widget_Undo(FPDF_DOCUMENT document,
1517                                         FPDF_WIDGET hWidget);
1518 /**
1519  * Function: FPDF_Widget_Redo
1520  *          This method will implement the redo feature for the specified xfa
1521  *field.
1522  * Parameters:
1523  *          document        -   Handle to document. Returned by
1524  *FPDF_LoadDocument function.
1525  *          hWidget         -   Handle to the xfa field.
1526  * Return Value:
1527  *          None.
1528  **/
1529 DLLEXPORT void STDCALL FPDF_Widget_Redo(FPDF_DOCUMENT document,
1530                                         FPDF_WIDGET hWidget);
1531 /**
1532  * Function: FPDF_Widget_SelectAll
1533  *          This method will implement the select all feature for the specified
1534  *xfa field.
1535  * Parameters:
1536  *          document        -   Handle to document. Returned by
1537  *FPDF_LoadDocument function.
1538  *          hWidget         -   Handle to the xfa field.
1539  * Return Value:
1540  *          None.
1541  **/
1542 DLLEXPORT void STDCALL FPDF_Widget_SelectAll(FPDF_DOCUMENT document,
1543                                              FPDF_WIDGET hWidget);
1544 /**
1545  * Function: FPDF_Widget_Copy
1546  *          This method will implement the copy feature for the specified xfa
1547  *field.
1548  * Parameters:
1549  *          document        -   Handle to document. Returned by
1550  *FPDF_LoadDocument function.
1551  *          hWidget         -   Handle to the xfa field.
1552  *          wsText          -   Pointer to data buffer to receive the copied
1553  *data, in UTF-16LE format.
1554  *          size            -   The data buffer size.
1555  * Return Value:
1556  *          None.
1557  **/
1558 DLLEXPORT void STDCALL FPDF_Widget_Copy(FPDF_DOCUMENT document,
1559                                         FPDF_WIDGET hWidget,
1560                                         FPDF_WIDESTRING wsText,
1561                                         FPDF_DWORD* size);
1562 /**
1563  * Function: FPDF_Widget_Cut
1564  *          This method will implement the cut feature for the specified xfa
1565  *field.
1566  * Parameters:
1567  *          document        -   Handle to document. Returned by
1568  *FPDF_LoadDocument function.
1569  *          hWidget         -   Handle to the xfa field.
1570  *          wsText          -   Pointer to data buffer to receive the cut
1571  *data,in UTF-16LE format.
1572  *          size            -   The data buffer size,not the byte number.
1573  * Return Value:
1574  *          None.
1575  **/
1576 DLLEXPORT void STDCALL FPDF_Widget_Cut(FPDF_DOCUMENT document,
1577                                        FPDF_WIDGET hWidget,
1578                                        FPDF_WIDESTRING wsText,
1579                                        FPDF_DWORD* size);
1580 /**
1581  * Function: FPDF_Widget_Paste
1582  *          This method will implement the paste feature for the specified xfa
1583  *field.
1584  * Parameters:
1585  *          document        -   Handle to document. Returned by
1586  *FPDF_LoadDocument function.
1587  *          hWidget         -   Handle to the xfa field.
1588  *          wsText          -   The paste text buffer, in UTF-16LE format.
1589  *          size            -   The data buffer size,not the byte number.
1590  * Return Value:
1591  *          None.
1592  **/
1593 DLLEXPORT void STDCALL FPDF_Widget_Paste(FPDF_DOCUMENT document,
1594                                          FPDF_WIDGET hWidget,
1595                                          FPDF_WIDESTRING wsText,
1596                                          FPDF_DWORD size);
1597 /**
1598  * Function: FPDF_Widget_ReplaceSpellCheckWord
1599  *          This method will implement the spell check feature for the specified
1600  *xfa field.
1601  * Parameters:
1602  *          document        -   Handle to document. Returned by
1603  *FPDF_LoadDocument function.
1604  *          hWidget         -   Handle to the xfa field.
1605  *          x               -   The x value of the specified point.
1606  *          y               -   The y value of the specified point.
1607  *          bsText          -   The text buffer needed to be speck check, in
1608  *UTF-16LE format.
1609  * Return Value:
1610  *          None.
1611  **/
1612 DLLEXPORT void STDCALL
1613 FPDF_Widget_ReplaceSpellCheckWord(FPDF_DOCUMENT document,
1614                                   FPDF_WIDGET hWidget,
1615                                   float x,
1616                                   float y,
1617                                   FPDF_BYTESTRING bsText);
1618 /**
1619  * Function: FPDF_Widget_GetSpellCheckWords
1620  *          This method will implement the spell check feature for the specified
1621  *xfa field.
1622  * Parameters:
1623  *          document        -   Handle to document. Returned by
1624  *FPDF_LoadDocument function.
1625  *          hWidget         -   Handle to the xfa field.
1626  *          x               -   The x value of the specified point.
1627  *          y               -   The y value of the specified point.
1628  *          stringHandle    -   Pointer to FPDF_STRINGHANDLE to receive the
1629  *speck check text buffer, in UTF-16LE format.
1630  * Return Value:
1631  *          None.
1632  **/
1633 DLLEXPORT void STDCALL
1634 FPDF_Widget_GetSpellCheckWords(FPDF_DOCUMENT document,
1635                                FPDF_WIDGET hWidget,
1636                                float x,
1637                                float y,
1638                                FPDF_STRINGHANDLE* stringHandle);
1639 /**
1640  * Function: FPDF_StringHandleCounts
1641  *          This method will get the count of the text buffer.
1642  * Parameters:
1643  *          stringHandle    -   Pointer to FPDF_STRINGHANDLE.
1644  * Return Value:
1645  *          None.
1646  **/
1647 DLLEXPORT int STDCALL FPDF_StringHandleCounts(FPDF_STRINGHANDLE stringHandle);
1648 /**
1649  * Function: FPDF_StringHandleGetStringByIndex
1650  *          This method will get the specified index of the text buffer.
1651  * Parameters:
1652  *          stringHandle    -   Pointer to FPDF_STRINGHANDLE.
1653  *          index           -   The specified index of text buffer.
1654  *          bsText          -   Pointer to data buffer to receive the text
1655  *buffer, in UTF-16LE format.
1656  *          size            -   The byte size of data buffer.
1657  * Return Value:
1658  *          TRUE indicates success, otherwise FALSE.
1659  **/
1660 DLLEXPORT FPDF_BOOL STDCALL
1661 FPDF_StringHandleGetStringByIndex(FPDF_STRINGHANDLE stringHandle,
1662                                   int index,
1663                                   FPDF_BYTESTRING bsText,
1664                                   FPDF_DWORD* size);
1665 /**
1666  * Function: FPDF_StringHandleRelease
1667  *          This method will release the FPDF_STRINGHANDLE.
1668  * Parameters:
1669  *          stringHandle    -   Pointer to FPDF_STRINGHANDLE.
1670  * Return Value:
1671  *          None.
1672  **/
1673 DLLEXPORT void STDCALL FPDF_StringHandleRelease(FPDF_STRINGHANDLE stringHandle);
1674 /**
1675  * Function: FPDF_StringHandleAddString
1676  *          This method will add the specified text buffer.
1677  * Parameters:
1678  *          stringHandle    -   Pointer to FPDF_STRINGHANDLE.
1679  *          bsText          -   Pointer to data buffer of the text buffer, in
1680  *UTF-16LE format.
1681  *          size            -   The byte size of data buffer.
1682  * Return Value:
1683  *          TRUE indicates success, otherwise FALSE.
1684  **/
1685 DLLEXPORT FPDF_BOOL STDCALL
1686 FPDF_StringHandleAddString(FPDF_STRINGHANDLE stringHandle,
1687                            FPDF_BYTESTRING bsText,
1688                            FPDF_DWORD size);
1689 #endif  // PDF_ENABLE_XFA
1690 
1691 #ifdef __cplusplus
1692 }
1693 #endif
1694 
1695 #endif  // PUBLIC_FPDF_FORMFILL_H_
1696