OLD | NEW |
| (Empty) |
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 #include "public/fpdf_formfill.h" | |
8 | |
9 #include <memory> | |
10 #include <vector> | |
11 | |
12 #include "core/include/fpdfapi/cpdf_document.h" | |
13 #include "fpdfsdk/include/fsdk_define.h" | |
14 #include "fpdfsdk/include/fsdk_mgr.h" | |
15 #include "public/fpdfview.h" | |
16 #include "third_party/base/stl_util.h" | |
17 | |
18 #ifdef PDF_ENABLE_XFA | |
19 #include "fpdfsdk/include/fpdfxfa/fpdfxfa_app.h" | |
20 #include "fpdfsdk/include/fpdfxfa/fpdfxfa_doc.h" | |
21 #include "fpdfsdk/include/fpdfxfa/fpdfxfa_page.h" | |
22 #endif // PDF_ENABLE_XFA | |
23 | |
24 namespace { | |
25 | |
26 CPDFSDK_InterForm* FormHandleToInterForm(FPDF_FORMHANDLE hHandle) { | |
27 CPDFSDK_Document* pSDKDoc = CPDFSDK_Document::FromFPDFFormHandle(hHandle); | |
28 return pSDKDoc ? pSDKDoc->GetInterForm() : nullptr; | |
29 } | |
30 | |
31 CPDFSDK_PageView* FormHandleToPageView(FPDF_FORMHANDLE hHandle, | |
32 FPDF_PAGE page) { | |
33 UnderlyingPageType* pPage = UnderlyingFromFPDFPage(page); | |
34 if (!pPage) | |
35 return nullptr; | |
36 | |
37 CPDFSDK_Document* pSDKDoc = CPDFSDK_Document::FromFPDFFormHandle(hHandle); | |
38 return pSDKDoc ? pSDKDoc->GetPageView(pPage, TRUE) : nullptr; | |
39 } | |
40 | |
41 #ifdef PDF_ENABLE_XFA | |
42 std::vector<CFX_ByteString>* FromFPDFStringHandle(FPDF_STRINGHANDLE handle) { | |
43 return reinterpret_cast<std::vector<CFX_ByteString>*>(handle); | |
44 } | |
45 | |
46 FPDF_STRINGHANDLE ToFPDFStringHandle(std::vector<CFX_ByteString>* strings) { | |
47 return reinterpret_cast<FPDF_STRINGHANDLE>(strings); | |
48 } | |
49 #endif // PDF_ENABLE_XFA | |
50 | |
51 } // namespace | |
52 | |
53 DLLEXPORT int STDCALL FPDFPage_HasFormFieldAtPoint(FPDF_FORMHANDLE hHandle, | |
54 FPDF_PAGE page, | |
55 double page_x, | |
56 double page_y) { | |
57 if (!hHandle) | |
58 return -1; | |
59 CPDF_Page* pPage = CPDFPageFromFPDFPage(page); | |
60 if (pPage) { | |
61 CPDF_InterForm interform(pPage->m_pDocument, FALSE); | |
62 CPDF_FormControl* pFormCtrl = | |
63 interform.GetControlAtPoint(pPage, static_cast<FX_FLOAT>(page_x), | |
64 static_cast<FX_FLOAT>(page_y), nullptr); | |
65 if (!pFormCtrl) | |
66 return -1; | |
67 CPDF_FormField* pFormField = pFormCtrl->GetField(); | |
68 return pFormField ? pFormField->GetFieldType() : -1; | |
69 } | |
70 | |
71 #ifdef PDF_ENABLE_XFA | |
72 CPDFXFA_Page* pXFAPage = UnderlyingFromFPDFPage(page); | |
73 if (!pXFAPage) | |
74 return -1; | |
75 | |
76 IXFA_PageView* pPageView = pXFAPage->GetXFAPageView(); | |
77 if (!pPageView) | |
78 return -1; | |
79 | |
80 IXFA_DocView* pDocView = pPageView->GetDocView(); | |
81 if (!pDocView) | |
82 return -1; | |
83 | |
84 IXFA_WidgetHandler* pWidgetHandler = pDocView->GetWidgetHandler(); | |
85 if (!pWidgetHandler) | |
86 return -1; | |
87 | |
88 std::unique_ptr<IXFA_WidgetIterator, ReleaseDeleter<IXFA_WidgetIterator>> | |
89 pWidgetIterator(pPageView->CreateWidgetIterator( | |
90 XFA_TRAVERSEWAY_Form, | |
91 XFA_WIDGETFILTER_Viewable | XFA_WIDGETFILTER_AllType)); | |
92 if (!pWidgetIterator) | |
93 return -1; | |
94 | |
95 IXFA_Widget* pXFAAnnot = pWidgetIterator->MoveToNext(); | |
96 while (pXFAAnnot) { | |
97 CFX_RectF rcBBox; | |
98 pWidgetHandler->GetBBox(pXFAAnnot, rcBBox, 0); | |
99 CFX_FloatRect rcWidget(rcBBox.left, rcBBox.top, rcBBox.left + rcBBox.width, | |
100 rcBBox.top + rcBBox.height); | |
101 rcWidget.left -= 1.0f; | |
102 rcWidget.right += 1.0f; | |
103 rcWidget.bottom -= 1.0f; | |
104 rcWidget.top += 1.0f; | |
105 | |
106 if (rcWidget.Contains(static_cast<FX_FLOAT>(page_x), | |
107 static_cast<FX_FLOAT>(page_y))) { | |
108 return FPDF_FORMFIELD_XFA; | |
109 } | |
110 pXFAAnnot = pWidgetIterator->MoveToNext(); | |
111 } | |
112 #endif // PDF_ENABLE_XFA | |
113 return -1; | |
114 } | |
115 | |
116 DLLEXPORT int STDCALL FPDPage_HasFormFieldAtPoint(FPDF_FORMHANDLE hHandle, | |
117 FPDF_PAGE page, | |
118 double page_x, | |
119 double page_y) { | |
120 return FPDFPage_HasFormFieldAtPoint(hHandle, page, page_x, page_y); | |
121 } | |
122 | |
123 DLLEXPORT int STDCALL FPDFPage_FormFieldZOrderAtPoint(FPDF_FORMHANDLE hHandle, | |
124 FPDF_PAGE page, | |
125 double page_x, | |
126 double page_y) { | |
127 if (!hHandle) | |
128 return -1; | |
129 CPDF_Page* pPage = CPDFPageFromFPDFPage(page); | |
130 if (!pPage) | |
131 return -1; | |
132 CPDF_InterForm interform(pPage->m_pDocument, FALSE); | |
133 int z_order = -1; | |
134 (void)interform.GetControlAtPoint(pPage, (FX_FLOAT)page_x, (FX_FLOAT)page_y, | |
135 &z_order); | |
136 return z_order; | |
137 } | |
138 | |
139 DLLEXPORT FPDF_FORMHANDLE STDCALL | |
140 FPDFDOC_InitFormFillEnvironment(FPDF_DOCUMENT document, | |
141 FPDF_FORMFILLINFO* formInfo) { | |
142 #ifdef PDF_ENABLE_XFA | |
143 const int kRequiredVersion = 2; | |
144 #else // PDF_ENABLE_XFA | |
145 const int kRequiredVersion = 1; | |
146 #endif // PDF_ENABLE_XFA | |
147 if (!formInfo || formInfo->version != kRequiredVersion) | |
148 return nullptr; | |
149 | |
150 UnderlyingDocumentType* pDocument = UnderlyingFromFPDFDocument(document); | |
151 if (!pDocument) | |
152 return nullptr; | |
153 | |
154 CPDFDoc_Environment* pEnv = new CPDFDoc_Environment(pDocument, formInfo); | |
155 #ifdef PDF_ENABLE_XFA | |
156 pEnv->SetSDKDocument(pDocument->GetSDKDocument(pEnv)); | |
157 CPDFXFA_App* pApp = CPDFXFA_App::GetInstance(); | |
158 pApp->AddFormFillEnv(pEnv); | |
159 #else // PDF_ENABLE_XFA | |
160 pEnv->SetSDKDocument(new CPDFSDK_Document(pDocument, pEnv)); | |
161 #endif // PDF_ENABLE_XFA | |
162 return pEnv; | |
163 } | |
164 | |
165 DLLEXPORT void STDCALL | |
166 FPDFDOC_ExitFormFillEnvironment(FPDF_FORMHANDLE hHandle) { | |
167 if (!hHandle) | |
168 return; | |
169 CPDFDoc_Environment* pEnv = (CPDFDoc_Environment*)hHandle; | |
170 #ifdef PDF_ENABLE_XFA | |
171 CPDFXFA_App* pApp = CPDFXFA_App::GetInstance(); | |
172 pApp->RemoveFormFillEnv(pEnv); | |
173 #else // PDF_ENABLE_XFA | |
174 if (CPDFSDK_Document* pSDKDoc = pEnv->GetSDKDocument()) { | |
175 pEnv->SetSDKDocument(NULL); | |
176 delete pSDKDoc; | |
177 } | |
178 #endif // PDF_ENABLE_XFA | |
179 delete pEnv; | |
180 } | |
181 | |
182 DLLEXPORT FPDF_BOOL STDCALL FORM_OnMouseMove(FPDF_FORMHANDLE hHandle, | |
183 FPDF_PAGE page, | |
184 int modifier, | |
185 double page_x, | |
186 double page_y) { | |
187 CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page); | |
188 if (!pPageView) | |
189 return FALSE; | |
190 | |
191 CFX_FloatPoint pt((FX_FLOAT)page_x, (FX_FLOAT)page_y); | |
192 return pPageView->OnMouseMove(pt, modifier); | |
193 } | |
194 | |
195 DLLEXPORT FPDF_BOOL STDCALL FORM_OnLButtonDown(FPDF_FORMHANDLE hHandle, | |
196 FPDF_PAGE page, | |
197 int modifier, | |
198 double page_x, | |
199 double page_y) { | |
200 CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page); | |
201 if (!pPageView) | |
202 return FALSE; | |
203 | |
204 CFX_FloatPoint pt((FX_FLOAT)page_x, (FX_FLOAT)page_y); | |
205 return pPageView->OnLButtonDown(pt, modifier); | |
206 } | |
207 | |
208 DLLEXPORT FPDF_BOOL STDCALL FORM_OnLButtonUp(FPDF_FORMHANDLE hHandle, | |
209 FPDF_PAGE page, | |
210 int modifier, | |
211 double page_x, | |
212 double page_y) { | |
213 CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page); | |
214 if (!pPageView) | |
215 return FALSE; | |
216 | |
217 CFX_FloatPoint pt((FX_FLOAT)page_x, (FX_FLOAT)page_y); | |
218 return pPageView->OnLButtonUp(pt, modifier); | |
219 } | |
220 | |
221 #ifdef PDF_ENABLE_XFA | |
222 DLLEXPORT FPDF_BOOL STDCALL FORM_OnRButtonDown(FPDF_FORMHANDLE hHandle, | |
223 FPDF_PAGE page, | |
224 int modifier, | |
225 double page_x, | |
226 double page_y) { | |
227 CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page); | |
228 if (!pPageView) | |
229 return FALSE; | |
230 | |
231 CFX_FloatPoint pt((FX_FLOAT)page_x, (FX_FLOAT)page_y); | |
232 return pPageView->OnRButtonDown(pt, modifier); | |
233 } | |
234 | |
235 DLLEXPORT FPDF_BOOL STDCALL FORM_OnRButtonUp(FPDF_FORMHANDLE hHandle, | |
236 FPDF_PAGE page, | |
237 int modifier, | |
238 double page_x, | |
239 double page_y) { | |
240 CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page); | |
241 if (!pPageView) | |
242 return FALSE; | |
243 | |
244 CFX_FloatPoint pt((FX_FLOAT)page_x, (FX_FLOAT)page_y); | |
245 return pPageView->OnRButtonUp(pt, modifier); | |
246 } | |
247 #endif // PDF_ENABLE_XFA | |
248 | |
249 DLLEXPORT FPDF_BOOL STDCALL FORM_OnKeyDown(FPDF_FORMHANDLE hHandle, | |
250 FPDF_PAGE page, | |
251 int nKeyCode, | |
252 int modifier) { | |
253 CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page); | |
254 if (!pPageView) | |
255 return FALSE; | |
256 | |
257 return pPageView->OnKeyDown(nKeyCode, modifier); | |
258 } | |
259 | |
260 DLLEXPORT FPDF_BOOL STDCALL FORM_OnKeyUp(FPDF_FORMHANDLE hHandle, | |
261 FPDF_PAGE page, | |
262 int nKeyCode, | |
263 int modifier) { | |
264 CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page); | |
265 if (!pPageView) | |
266 return FALSE; | |
267 | |
268 return pPageView->OnKeyUp(nKeyCode, modifier); | |
269 } | |
270 | |
271 DLLEXPORT FPDF_BOOL STDCALL FORM_OnChar(FPDF_FORMHANDLE hHandle, | |
272 FPDF_PAGE page, | |
273 int nChar, | |
274 int modifier) { | |
275 CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page); | |
276 if (!pPageView) | |
277 return FALSE; | |
278 | |
279 return pPageView->OnChar(nChar, modifier); | |
280 } | |
281 | |
282 DLLEXPORT FPDF_BOOL STDCALL FORM_ForceToKillFocus(FPDF_FORMHANDLE hHandle) { | |
283 CPDFSDK_Document* pSDKDoc = CPDFSDK_Document::FromFPDFFormHandle(hHandle); | |
284 if (!pSDKDoc) | |
285 return FALSE; | |
286 | |
287 return pSDKDoc->KillFocusAnnot(0); | |
288 } | |
289 | |
290 DLLEXPORT void STDCALL FPDF_FFLDraw(FPDF_FORMHANDLE hHandle, | |
291 FPDF_BITMAP bitmap, | |
292 FPDF_PAGE page, | |
293 int start_x, | |
294 int start_y, | |
295 int size_x, | |
296 int size_y, | |
297 int rotate, | |
298 int flags) { | |
299 if (!hHandle) | |
300 return; | |
301 | |
302 UnderlyingPageType* pPage = UnderlyingFromFPDFPage(page); | |
303 if (!pPage) | |
304 return; | |
305 | |
306 #ifndef PDF_ENABLE_XFA | |
307 CPDF_RenderOptions options; | |
308 if (flags & FPDF_LCD_TEXT) | |
309 options.m_Flags |= RENDER_CLEARTYPE; | |
310 else | |
311 options.m_Flags &= ~RENDER_CLEARTYPE; | |
312 // Grayscale output | |
313 if (flags & FPDF_GRAYSCALE) { | |
314 options.m_ColorMode = RENDER_COLOR_GRAY; | |
315 options.m_ForeColor = 0; | |
316 options.m_BackColor = 0xffffff; | |
317 } | |
318 options.m_AddFlags = flags >> 8; | |
319 options.m_pOCContext = new CPDF_OCContext(pPage->m_pDocument); | |
320 #else // PDF_ENABLE_XFA | |
321 CPDFXFA_Document* pDocument = pPage->GetDocument(); | |
322 if (!pDocument) | |
323 return; | |
324 CPDF_Document* pPDFDoc = pDocument->GetPDFDoc(); | |
325 if (!pPDFDoc) | |
326 return; | |
327 CPDFDoc_Environment* pEnv = (CPDFDoc_Environment*)hHandle; | |
328 CPDFSDK_Document* pFXDoc = pEnv->GetSDKDocument(); | |
329 if (!pFXDoc) | |
330 return; | |
331 #endif // PDF_ENABLE_XFA | |
332 | |
333 CFX_Matrix matrix; | |
334 pPage->GetDisplayMatrix(matrix, start_x, start_y, size_x, size_y, rotate); | |
335 | |
336 FX_RECT clip(start_x, start_y, start_x + size_x, start_y + size_y); | |
337 | |
338 #ifdef _SKIA_SUPPORT_ | |
339 std::unique_ptr<CFX_SkiaDevice> pDevice(new CFX_SkiaDevice); | |
340 #else | |
341 std::unique_ptr<CFX_FxgeDevice> pDevice(new CFX_FxgeDevice); | |
342 #endif | |
343 pDevice->Attach((CFX_DIBitmap*)bitmap); | |
344 pDevice->SaveState(); | |
345 pDevice->SetClip_Rect(clip); | |
346 | |
347 #ifndef PDF_ENABLE_XFA | |
348 if (CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, pPage)) | |
349 pPageView->PageView_OnDraw(pDevice.get(), &matrix, &options); | |
350 #else // PDF_ENABLE_XFA | |
351 CPDF_RenderOptions options; | |
352 if (flags & FPDF_LCD_TEXT) | |
353 options.m_Flags |= RENDER_CLEARTYPE; | |
354 else | |
355 options.m_Flags &= ~RENDER_CLEARTYPE; | |
356 | |
357 // Grayscale output | |
358 if (flags & FPDF_GRAYSCALE) { | |
359 options.m_ColorMode = RENDER_COLOR_GRAY; | |
360 options.m_ForeColor = 0; | |
361 options.m_BackColor = 0xffffff; | |
362 } | |
363 options.m_AddFlags = flags >> 8; | |
364 options.m_pOCContext = new CPDF_OCContext(pPDFDoc); | |
365 | |
366 if (CPDFSDK_PageView* pPageView = pFXDoc->GetPageView(pPage)) | |
367 pPageView->PageView_OnDraw(pDevice.get(), &matrix, &options, clip); | |
368 #endif // PDF_ENABLE_XFA | |
369 | |
370 pDevice->RestoreState(); | |
371 delete options.m_pOCContext; | |
372 #ifdef PDF_ENABLE_XFA | |
373 options.m_pOCContext = NULL; | |
374 #endif // PDF_ENABLE_XFA | |
375 } | |
376 | |
377 #ifdef PDF_ENABLE_XFA | |
378 DLLEXPORT void STDCALL FPDF_Widget_Undo(FPDF_DOCUMENT document, | |
379 FPDF_WIDGET hWidget) { | |
380 if (NULL == hWidget || NULL == document) | |
381 return; | |
382 | |
383 CPDFXFA_Document* pDocument = (CPDFXFA_Document*)document; | |
384 if (pDocument->GetDocType() != XFA_DOCTYPE_Dynamic && | |
385 pDocument->GetDocType() != XFA_DOCTYPE_Static) | |
386 return; | |
387 | |
388 IXFA_MenuHandler* pXFAMenuHander = | |
389 CPDFXFA_App::GetInstance()->GetXFAApp()->GetMenuHandler(); | |
390 if (pXFAMenuHander == NULL) | |
391 return; | |
392 | |
393 pXFAMenuHander->Undo((IXFA_Widget*)hWidget); | |
394 } | |
395 DLLEXPORT void STDCALL FPDF_Widget_Redo(FPDF_DOCUMENT document, | |
396 FPDF_WIDGET hWidget) { | |
397 if (NULL == hWidget || NULL == document) | |
398 return; | |
399 | |
400 CPDFXFA_Document* pDocument = (CPDFXFA_Document*)document; | |
401 if (pDocument->GetDocType() != XFA_DOCTYPE_Dynamic && | |
402 pDocument->GetDocType() != XFA_DOCTYPE_Static) | |
403 return; | |
404 | |
405 IXFA_MenuHandler* pXFAMenuHander = | |
406 CPDFXFA_App::GetInstance()->GetXFAApp()->GetMenuHandler(); | |
407 if (pXFAMenuHander == NULL) | |
408 return; | |
409 | |
410 pXFAMenuHander->Redo((IXFA_Widget*)hWidget); | |
411 } | |
412 | |
413 DLLEXPORT void STDCALL FPDF_Widget_SelectAll(FPDF_DOCUMENT document, | |
414 FPDF_WIDGET hWidget) { | |
415 if (NULL == hWidget || NULL == document) | |
416 return; | |
417 | |
418 CPDFXFA_Document* pDocument = (CPDFXFA_Document*)document; | |
419 if (pDocument->GetDocType() != XFA_DOCTYPE_Dynamic && | |
420 pDocument->GetDocType() != XFA_DOCTYPE_Static) | |
421 return; | |
422 | |
423 IXFA_MenuHandler* pXFAMenuHander = | |
424 CPDFXFA_App::GetInstance()->GetXFAApp()->GetMenuHandler(); | |
425 if (pXFAMenuHander == NULL) | |
426 return; | |
427 | |
428 pXFAMenuHander->SelectAll((IXFA_Widget*)hWidget); | |
429 } | |
430 DLLEXPORT void STDCALL FPDF_Widget_Copy(FPDF_DOCUMENT document, | |
431 FPDF_WIDGET hWidget, | |
432 FPDF_WIDESTRING wsText, | |
433 FPDF_DWORD* size) { | |
434 if (NULL == hWidget || NULL == document) | |
435 return; | |
436 | |
437 CPDFXFA_Document* pDocument = (CPDFXFA_Document*)document; | |
438 if (pDocument->GetDocType() != XFA_DOCTYPE_Dynamic && | |
439 pDocument->GetDocType() != XFA_DOCTYPE_Static) | |
440 return; | |
441 | |
442 IXFA_MenuHandler* pXFAMenuHander = | |
443 CPDFXFA_App::GetInstance()->GetXFAApp()->GetMenuHandler(); | |
444 if (pXFAMenuHander == NULL) | |
445 return; | |
446 | |
447 CFX_WideString wsCpText; | |
448 pXFAMenuHander->Copy((IXFA_Widget*)hWidget, wsCpText); | |
449 | |
450 CFX_ByteString bsCpText = wsCpText.UTF16LE_Encode(); | |
451 int len = bsCpText.GetLength() / sizeof(unsigned short); | |
452 if (wsText == NULL) { | |
453 *size = len; | |
454 return; | |
455 } | |
456 | |
457 int real_size = len < *size ? len : *size; | |
458 if (real_size > 0) { | |
459 FXSYS_memcpy((void*)wsText, | |
460 bsCpText.GetBuffer(real_size * sizeof(unsigned short)), | |
461 real_size * sizeof(unsigned short)); | |
462 bsCpText.ReleaseBuffer(real_size * sizeof(unsigned short)); | |
463 } | |
464 *size = real_size; | |
465 } | |
466 | |
467 DLLEXPORT void STDCALL FPDF_Widget_Cut(FPDF_DOCUMENT document, | |
468 FPDF_WIDGET hWidget, | |
469 FPDF_WIDESTRING wsText, | |
470 FPDF_DWORD* size) { | |
471 if (NULL == hWidget || NULL == document) | |
472 return; | |
473 CPDFXFA_Document* pDocument = (CPDFXFA_Document*)document; | |
474 if (pDocument->GetDocType() != XFA_DOCTYPE_Dynamic && | |
475 pDocument->GetDocType() != XFA_DOCTYPE_Static) | |
476 return; | |
477 | |
478 IXFA_MenuHandler* pXFAMenuHander = | |
479 CPDFXFA_App::GetInstance()->GetXFAApp()->GetMenuHandler(); | |
480 if (pXFAMenuHander == NULL) | |
481 return; | |
482 | |
483 CFX_WideString wsCpText; | |
484 pXFAMenuHander->Cut((IXFA_Widget*)hWidget, wsCpText); | |
485 | |
486 CFX_ByteString bsCpText = wsCpText.UTF16LE_Encode(); | |
487 int len = bsCpText.GetLength() / sizeof(unsigned short); | |
488 if (wsText == NULL) { | |
489 *size = len; | |
490 return; | |
491 } | |
492 | |
493 int real_size = len < *size ? len : *size; | |
494 if (real_size > 0) { | |
495 FXSYS_memcpy((void*)wsText, | |
496 bsCpText.GetBuffer(real_size * sizeof(unsigned short)), | |
497 real_size * sizeof(unsigned short)); | |
498 bsCpText.ReleaseBuffer(real_size * sizeof(unsigned short)); | |
499 } | |
500 *size = real_size; | |
501 } | |
502 | |
503 DLLEXPORT void STDCALL FPDF_Widget_Paste(FPDF_DOCUMENT document, | |
504 FPDF_WIDGET hWidget, | |
505 FPDF_WIDESTRING wsText, | |
506 FPDF_DWORD size) { | |
507 if (NULL == hWidget || NULL == document) | |
508 return; | |
509 | |
510 CPDFXFA_Document* pDocument = (CPDFXFA_Document*)document; | |
511 if (pDocument->GetDocType() != XFA_DOCTYPE_Dynamic && | |
512 pDocument->GetDocType() != XFA_DOCTYPE_Static) | |
513 return; | |
514 | |
515 IXFA_MenuHandler* pXFAMenuHander = | |
516 CPDFXFA_App::GetInstance()->GetXFAApp()->GetMenuHandler(); | |
517 if (pXFAMenuHander == NULL) | |
518 return; | |
519 | |
520 CFX_WideString wstr = CFX_WideString::FromUTF16LE(wsText, size); | |
521 pXFAMenuHander->Paste((IXFA_Widget*)hWidget, wstr); | |
522 } | |
523 | |
524 DLLEXPORT void STDCALL | |
525 FPDF_Widget_ReplaceSpellCheckWord(FPDF_DOCUMENT document, | |
526 FPDF_WIDGET hWidget, | |
527 float x, | |
528 float y, | |
529 FPDF_BYTESTRING bsText) { | |
530 if (NULL == hWidget || NULL == document) | |
531 return; | |
532 | |
533 CPDFXFA_Document* pDocument = (CPDFXFA_Document*)document; | |
534 if (pDocument->GetDocType() != XFA_DOCTYPE_Dynamic && | |
535 pDocument->GetDocType() != XFA_DOCTYPE_Static) | |
536 return; | |
537 | |
538 IXFA_MenuHandler* pXFAMenuHander = | |
539 CPDFXFA_App::GetInstance()->GetXFAApp()->GetMenuHandler(); | |
540 if (pXFAMenuHander == NULL) | |
541 return; | |
542 | |
543 CFX_PointF ptPopup; | |
544 ptPopup.x = x; | |
545 ptPopup.y = y; | |
546 CFX_ByteStringC bs(bsText); | |
547 pXFAMenuHander->ReplaceSpellCheckWord((IXFA_Widget*)hWidget, ptPopup, bs); | |
548 } | |
549 | |
550 DLLEXPORT void STDCALL | |
551 FPDF_Widget_GetSpellCheckWords(FPDF_DOCUMENT document, | |
552 FPDF_WIDGET hWidget, | |
553 float x, | |
554 float y, | |
555 FPDF_STRINGHANDLE* stringHandle) { | |
556 if (!hWidget || !document) | |
557 return; | |
558 | |
559 CPDFXFA_Document* pDocument = (CPDFXFA_Document*)document; | |
560 if (pDocument->GetDocType() != XFA_DOCTYPE_Dynamic && | |
561 pDocument->GetDocType() != XFA_DOCTYPE_Static) | |
562 return; | |
563 | |
564 IXFA_MenuHandler* pXFAMenuHander = | |
565 CPDFXFA_App::GetInstance()->GetXFAApp()->GetMenuHandler(); | |
566 if (!pXFAMenuHander) | |
567 return; | |
568 | |
569 std::vector<CFX_ByteString>* sSuggestWords = new std::vector<CFX_ByteString>; | |
570 CFX_PointF ptPopup; | |
571 ptPopup.x = x; | |
572 ptPopup.y = y; | |
573 pXFAMenuHander->GetSuggestWords(reinterpret_cast<IXFA_Widget*>(hWidget), | |
574 ptPopup, *sSuggestWords); | |
575 *stringHandle = ToFPDFStringHandle(sSuggestWords); | |
576 } | |
577 | |
578 DLLEXPORT int STDCALL FPDF_StringHandleCounts(FPDF_STRINGHANDLE sHandle) { | |
579 std::vector<CFX_ByteString>* sSuggestWords = FromFPDFStringHandle(sHandle); | |
580 return sSuggestWords ? pdfium::CollectionSize<int>(*sSuggestWords) : -1; | |
581 } | |
582 | |
583 DLLEXPORT FPDF_BOOL STDCALL | |
584 FPDF_StringHandleGetStringByIndex(FPDF_STRINGHANDLE sHandle, | |
585 int index, | |
586 FPDF_BYTESTRING bsText, | |
587 FPDF_DWORD* size) { | |
588 if (!sHandle || !size) | |
589 return FALSE; | |
590 | |
591 int count = FPDF_StringHandleCounts(sHandle); | |
592 if (index < 0 || index >= count) | |
593 return FALSE; | |
594 | |
595 std::vector<CFX_ByteString>* sSuggestWords = FromFPDFStringHandle(sHandle); | |
596 int len = (*sSuggestWords)[index].GetLength(); | |
597 if (!bsText) { | |
598 *size = len; | |
599 return TRUE; | |
600 } | |
601 | |
602 int real_size = len < *size ? len : *size; | |
603 if (real_size > 0) | |
604 FXSYS_memcpy((void*)bsText, (const FX_CHAR*)(*sSuggestWords)[index], | |
605 real_size); | |
606 *size = real_size; | |
607 return TRUE; | |
608 } | |
609 | |
610 DLLEXPORT void STDCALL | |
611 FPDF_StringHandleRelease(FPDF_STRINGHANDLE stringHandle) { | |
612 delete FromFPDFStringHandle(stringHandle); | |
613 } | |
614 | |
615 DLLEXPORT FPDF_BOOL STDCALL | |
616 FPDF_StringHandleAddString(FPDF_STRINGHANDLE stringHandle, | |
617 FPDF_BYTESTRING bsText, | |
618 FPDF_DWORD size) { | |
619 if (!stringHandle || !bsText || size == 0) | |
620 return FALSE; | |
621 | |
622 FromFPDFStringHandle(stringHandle)->push_back(CFX_ByteString(bsText, size)); | |
623 return TRUE; | |
624 } | |
625 #endif // PDF_ENABLE_XFA | |
626 | |
627 DLLEXPORT void STDCALL FPDF_SetFormFieldHighlightColor(FPDF_FORMHANDLE hHandle, | |
628 int fieldType, | |
629 unsigned long color) { | |
630 if (CPDFSDK_InterForm* pInterForm = FormHandleToInterForm(hHandle)) | |
631 pInterForm->SetHighlightColor(color, fieldType); | |
632 } | |
633 | |
634 DLLEXPORT void STDCALL FPDF_SetFormFieldHighlightAlpha(FPDF_FORMHANDLE hHandle, | |
635 unsigned char alpha) { | |
636 if (CPDFSDK_InterForm* pInterForm = FormHandleToInterForm(hHandle)) | |
637 pInterForm->SetHighlightAlpha(alpha); | |
638 } | |
639 | |
640 DLLEXPORT void STDCALL FPDF_RemoveFormFieldHighlight(FPDF_FORMHANDLE hHandle) { | |
641 if (CPDFSDK_InterForm* pInterForm = FormHandleToInterForm(hHandle)) | |
642 pInterForm->RemoveAllHighLight(); | |
643 } | |
644 | |
645 DLLEXPORT void STDCALL FORM_OnAfterLoadPage(FPDF_PAGE page, | |
646 FPDF_FORMHANDLE hHandle) { | |
647 if (CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page)) | |
648 pPageView->SetValid(TRUE); | |
649 } | |
650 | |
651 DLLEXPORT void STDCALL FORM_OnBeforeClosePage(FPDF_PAGE page, | |
652 FPDF_FORMHANDLE hHandle) { | |
653 if (!hHandle) | |
654 return; | |
655 | |
656 CPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetSDKDocument(); | |
657 if (!pSDKDoc) | |
658 return; | |
659 | |
660 UnderlyingPageType* pPage = UnderlyingFromFPDFPage(page); | |
661 if (!pPage) | |
662 return; | |
663 | |
664 CPDFSDK_PageView* pPageView = pSDKDoc->GetPageView(pPage, FALSE); | |
665 if (pPageView) { | |
666 pPageView->SetValid(FALSE); | |
667 // RemovePageView() takes care of the delete for us. | |
668 pSDKDoc->RemovePageView(pPage); | |
669 } | |
670 } | |
671 | |
672 DLLEXPORT void STDCALL FORM_DoDocumentJSAction(FPDF_FORMHANDLE hHandle) { | |
673 CPDFSDK_Document* pSDKDoc = CPDFSDK_Document::FromFPDFFormHandle(hHandle); | |
674 if (pSDKDoc && ((CPDFDoc_Environment*)hHandle)->IsJSInitiated()) | |
675 pSDKDoc->ProcJavascriptFun(); | |
676 } | |
677 | |
678 DLLEXPORT void STDCALL FORM_DoDocumentOpenAction(FPDF_FORMHANDLE hHandle) { | |
679 CPDFSDK_Document* pSDKDoc = CPDFSDK_Document::FromFPDFFormHandle(hHandle); | |
680 if (pSDKDoc && ((CPDFDoc_Environment*)hHandle)->IsJSInitiated()) | |
681 pSDKDoc->ProcOpenAction(); | |
682 } | |
683 | |
684 DLLEXPORT void STDCALL FORM_DoDocumentAAction(FPDF_FORMHANDLE hHandle, | |
685 int aaType) { | |
686 CPDFSDK_Document* pSDKDoc = CPDFSDK_Document::FromFPDFFormHandle(hHandle); | |
687 if (!pSDKDoc) | |
688 return; | |
689 | |
690 CPDF_Document* pDoc = pSDKDoc->GetPDFDocument(); | |
691 CPDF_Dictionary* pDic = pDoc->GetRoot(); | |
692 if (!pDic) | |
693 return; | |
694 | |
695 CPDF_AAction aa(pDic->GetDictBy("AA")); | |
696 if (aa.ActionExist((CPDF_AAction::AActionType)aaType)) { | |
697 CPDF_Action action = aa.GetAction((CPDF_AAction::AActionType)aaType); | |
698 CPDFSDK_ActionHandler* pActionHandler = | |
699 ((CPDFDoc_Environment*)hHandle)->GetActionHander(); | |
700 pActionHandler->DoAction_Document(action, (CPDF_AAction::AActionType)aaType, | |
701 pSDKDoc); | |
702 } | |
703 } | |
704 | |
705 DLLEXPORT void STDCALL FORM_DoPageAAction(FPDF_PAGE page, | |
706 FPDF_FORMHANDLE hHandle, | |
707 int aaType) { | |
708 if (!hHandle) | |
709 return; | |
710 CPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetSDKDocument(); | |
711 UnderlyingPageType* pPage = UnderlyingFromFPDFPage(page); | |
712 CPDF_Page* pPDFPage = CPDFPageFromFPDFPage(page); | |
713 if (!pPDFPage) | |
714 return; | |
715 if (pSDKDoc->GetPageView(pPage, FALSE)) { | |
716 CPDFDoc_Environment* pEnv = pSDKDoc->GetEnv(); | |
717 CPDFSDK_ActionHandler* pActionHandler = pEnv->GetActionHander(); | |
718 CPDF_Dictionary* pPageDict = pPDFPage->m_pFormDict; | |
719 CPDF_AAction aa(pPageDict->GetDictBy("AA")); | |
720 if (FPDFPAGE_AACTION_OPEN == aaType) { | |
721 if (aa.ActionExist(CPDF_AAction::OpenPage)) { | |
722 CPDF_Action action = aa.GetAction(CPDF_AAction::OpenPage); | |
723 pActionHandler->DoAction_Page(action, CPDF_AAction::OpenPage, pSDKDoc); | |
724 } | |
725 } else { | |
726 if (aa.ActionExist(CPDF_AAction::ClosePage)) { | |
727 CPDF_Action action = aa.GetAction(CPDF_AAction::ClosePage); | |
728 pActionHandler->DoAction_Page(action, CPDF_AAction::ClosePage, pSDKDoc); | |
729 } | |
730 } | |
731 } | |
732 } | |
OLD | NEW |