| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 1 | // Copyright 2016 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 |  | 
| Lei Zhang | c345065 | 2018-10-11 16:54:42 +0000 | [diff] [blame] | 7 | #include "fpdfsdk/cpdfsdk_interactiveform.h" | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 8 |  | 
 | 9 | #include <algorithm> | 
 | 10 | #include <memory> | 
| Henrique Nakashima | 5c09f4c | 2017-08-04 12:28:52 -0400 | [diff] [blame] | 11 | #include <sstream> | 
 | 12 | #include <string> | 
| Tom Sepez | e005dc3 | 2018-06-19 17:33:32 +0000 | [diff] [blame] | 13 | #include <utility> | 
| thestig | 7c292e0 | 2016-09-28 14:14:26 -0700 | [diff] [blame] | 14 | #include <vector> | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 15 |  | 
| dsinclair | 41872fa | 2016-10-04 11:29:35 -0700 | [diff] [blame] | 16 | #include "core/fpdfapi/page/cpdf_page.h" | 
| dsinclair | 488b7ad | 2016-10-04 11:55:50 -0700 | [diff] [blame] | 17 | #include "core/fpdfapi/parser/cfdf_document.h" | 
 | 18 | #include "core/fpdfapi/parser/cpdf_array.h" | 
| Lei Zhang | 8153561 | 2018-10-09 21:15:17 +0000 | [diff] [blame] | 19 | #include "core/fpdfapi/parser/cpdf_dictionary.h" | 
| dsinclair | 488b7ad | 2016-10-04 11:55:50 -0700 | [diff] [blame] | 20 | #include "core/fpdfapi/parser/cpdf_document.h" | 
 | 21 | #include "core/fpdfapi/parser/cpdf_stream.h" | 
| dsinclair | 1727aee | 2016-09-29 13:12:56 -0700 | [diff] [blame] | 22 | #include "core/fpdfdoc/cpdf_actionfields.h" | 
| Lei Zhang | c345065 | 2018-10-11 16:54:42 +0000 | [diff] [blame] | 23 | #include "core/fpdfdoc/cpdf_interactiveform.h" | 
| Tom Sepez | c22d671 | 2018-06-05 22:33:31 +0000 | [diff] [blame] | 24 | #include "core/fxcrt/autorestorer.h" | 
| dsinclair | 74a34fc | 2016-09-29 16:41:42 -0700 | [diff] [blame] | 25 | #include "core/fxge/cfx_graphstatedata.h" | 
 | 26 | #include "core/fxge/cfx_pathdata.h" | 
| Dan Sinclair | 7d12532 | 2018-03-28 18:49:34 +0000 | [diff] [blame] | 27 | #include "fpdfsdk/cpdfsdk_actionhandler.h" | 
| dsinclair | 114e46a | 2016-09-29 17:18:21 -0700 | [diff] [blame] | 28 | #include "fpdfsdk/cpdfsdk_annot.h" | 
| Dan Sinclair | cbf76e6 | 2018-03-28 21:00:35 +0000 | [diff] [blame] | 29 | #include "fpdfsdk/cpdfsdk_annotiterator.h" | 
| dsinclair | 735606d | 2016-10-05 15:47:02 -0700 | [diff] [blame] | 30 | #include "fpdfsdk/cpdfsdk_formfillenvironment.h" | 
| Dan Sinclair | 00d47a6 | 2018-03-28 18:39:04 +0000 | [diff] [blame] | 31 | #include "fpdfsdk/cpdfsdk_helpers.h" | 
| dsinclair | 114e46a | 2016-09-29 17:18:21 -0700 | [diff] [blame] | 32 | #include "fpdfsdk/cpdfsdk_pageview.h" | 
 | 33 | #include "fpdfsdk/cpdfsdk_widget.h" | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 34 | #include "fpdfsdk/formfiller/cffl_formfiller.h" | 
| dsinclair | 114e46a | 2016-09-29 17:18:21 -0700 | [diff] [blame] | 35 | #include "fpdfsdk/ipdfsdk_annothandler.h" | 
| Dan Sinclair | e0345a4 | 2017-10-30 20:20:42 +0000 | [diff] [blame] | 36 | #include "fxjs/ijs_event_context.h" | 
 | 37 | #include "fxjs/ijs_runtime.h" | 
| Lei Zhang | 99f5bbb | 2018-10-09 21:31:28 +0000 | [diff] [blame] | 38 | #include "third_party/base/ptr_util.h" | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 39 |  | 
 | 40 | #ifdef PDF_ENABLE_XFA | 
| dsinclair | 114e46a | 2016-09-29 17:18:21 -0700 | [diff] [blame] | 41 | #include "fpdfsdk/cpdfsdk_xfawidget.h" | 
| dsinclair | 521b750 | 2016-11-02 13:02:28 -0700 | [diff] [blame] | 42 | #include "fpdfsdk/fpdfxfa/cpdfxfa_context.h" | 
| dsinclair | 4d29e78 | 2016-10-04 14:02:47 -0700 | [diff] [blame] | 43 | #include "fpdfsdk/fpdfxfa/cxfa_fwladaptertimermgr.h" | 
| dsinclair | 5b49309 | 2016-09-29 20:20:24 -0700 | [diff] [blame] | 44 | #include "xfa/fxfa/cxfa_eventparam.h" | 
| Dan Sinclair | 80c4878 | 2017-03-23 12:11:20 -0400 | [diff] [blame] | 45 | #include "xfa/fxfa/cxfa_ffdocview.h" | 
 | 46 | #include "xfa/fxfa/cxfa_ffwidget.h" | 
 | 47 | #include "xfa/fxfa/cxfa_ffwidgethandler.h" | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 48 | #endif  // PDF_ENABLE_XFA | 
 | 49 |  | 
| Ryan Harrison | 9baf31f | 2018-01-12 18:36:30 +0000 | [diff] [blame] | 50 | namespace { | 
 | 51 |  | 
| Lei Zhang | 4f7479a | 2018-03-21 13:37:06 +0000 | [diff] [blame] | 52 | constexpr uint32_t kWhiteBGR = FXSYS_BGR(255, 255, 255); | 
 | 53 |  | 
| Ryan Harrison | 9baf31f | 2018-01-12 18:36:30 +0000 | [diff] [blame] | 54 | bool IsFormFieldTypeComboOrText(FormFieldType fieldType) { | 
 | 55 |   switch (fieldType) { | 
 | 56 |     case FormFieldType::kComboBox: | 
 | 57 |     case FormFieldType::kTextField: | 
 | 58 |       return true; | 
 | 59 |     default: | 
 | 60 |       return false; | 
 | 61 |   } | 
 | 62 | } | 
 | 63 |  | 
| Ryan Harrison | 2056fac | 2018-01-16 16:06:45 +0000 | [diff] [blame] | 64 | #ifdef PDF_ENABLE_XFA | 
 | 65 | bool IsFormFieldTypeXFA(FormFieldType fieldType) { | 
 | 66 |   switch (fieldType) { | 
 | 67 |     case FormFieldType::kXFA: | 
 | 68 |     case FormFieldType::kXFA_CheckBox: | 
 | 69 |     case FormFieldType::kXFA_ComboBox: | 
 | 70 |     case FormFieldType::kXFA_ImageField: | 
 | 71 |     case FormFieldType::kXFA_ListBox: | 
 | 72 |     case FormFieldType::kXFA_PushButton: | 
 | 73 |     case FormFieldType::kXFA_Signature: | 
 | 74 |     case FormFieldType::kXFA_TextField: | 
 | 75 |       return true; | 
 | 76 |     default: | 
 | 77 |       return false; | 
 | 78 |   } | 
 | 79 | } | 
 | 80 | #endif  // PDF_ENABLE_XFA | 
 | 81 |  | 
| Lei Zhang | 2ee811f | 2018-08-13 21:32:50 +0000 | [diff] [blame] | 82 | bool FDFToURLEncodedData(std::vector<uint8_t>* pBuffer) { | 
| Lei Zhang | f0260b2 | 2018-08-13 22:50:02 +0000 | [diff] [blame] | 83 |   std::unique_ptr<CFDF_Document> pFDF = CFDF_Document::ParseMemory(*pBuffer); | 
| Lei Zhang | 4f1aa69 | 2018-08-13 21:31:18 +0000 | [diff] [blame] | 84 |   if (!pFDF) | 
 | 85 |     return true; | 
 | 86 |  | 
 | 87 |   CPDF_Dictionary* pMainDict = pFDF->GetRoot()->GetDictFor("FDF"); | 
 | 88 |   if (!pMainDict) | 
 | 89 |     return false; | 
 | 90 |  | 
 | 91 |   CPDF_Array* pFields = pMainDict->GetArrayFor("Fields"); | 
 | 92 |   if (!pFields) | 
 | 93 |     return false; | 
 | 94 |  | 
 | 95 |   std::ostringstream fdfEncodedData; | 
| Lei Zhang | f40380f | 2018-10-12 18:31:51 +0000 | [diff] [blame] | 96 |   for (uint32_t i = 0; i < pFields->size(); i++) { | 
| Lei Zhang | 4f1aa69 | 2018-08-13 21:31:18 +0000 | [diff] [blame] | 97 |     CPDF_Dictionary* pField = pFields->GetDictAt(i); | 
 | 98 |     if (!pField) | 
 | 99 |       continue; | 
 | 100 |     WideString name; | 
 | 101 |     name = pField->GetUnicodeTextFor("T"); | 
 | 102 |     ByteString name_b = name.ToDefANSI(); | 
 | 103 |     ByteString csBValue = pField->GetStringFor("V"); | 
 | 104 |     WideString csWValue = PDF_DecodeText(csBValue); | 
 | 105 |     ByteString csValue_b = csWValue.ToDefANSI(); | 
 | 106 |     fdfEncodedData << name_b << "=" << csValue_b; | 
| Lei Zhang | f40380f | 2018-10-12 18:31:51 +0000 | [diff] [blame] | 107 |     if (i != pFields->size() - 1) | 
| Lei Zhang | 4f1aa69 | 2018-08-13 21:31:18 +0000 | [diff] [blame] | 108 |       fdfEncodedData << "&"; | 
 | 109 |   } | 
 | 110 |  | 
| Lei Zhang | 2ee811f | 2018-08-13 21:32:50 +0000 | [diff] [blame] | 111 |   size_t nBufSize = fdfEncodedData.tellp(); | 
| Lei Zhang | 4f1aa69 | 2018-08-13 21:31:18 +0000 | [diff] [blame] | 112 |   if (nBufSize <= 0) | 
 | 113 |     return false; | 
 | 114 |  | 
| Lei Zhang | 2ee811f | 2018-08-13 21:32:50 +0000 | [diff] [blame] | 115 |   pBuffer->resize(nBufSize); | 
 | 116 |   memcpy(pBuffer->data(), fdfEncodedData.str().c_str(), nBufSize); | 
| Lei Zhang | 4f1aa69 | 2018-08-13 21:31:18 +0000 | [diff] [blame] | 117 |   return true; | 
 | 118 | } | 
 | 119 |  | 
| Ryan Harrison | 9baf31f | 2018-01-12 18:36:30 +0000 | [diff] [blame] | 120 | }  // namespace | 
 | 121 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 122 | CPDFSDK_InteractiveForm::CPDFSDK_InteractiveForm( | 
 | 123 |     CPDFSDK_FormFillEnvironment* pFormFillEnv) | 
| dsinclair | 690c033 | 2016-10-11 09:13:01 -0700 | [diff] [blame] | 124 |     : m_pFormFillEnv(pFormFillEnv), | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 125 |       m_pInteractiveForm(pdfium::MakeUnique<CPDF_InteractiveForm>( | 
| Lei Zhang | 461acb2 | 2018-10-10 18:38:03 +0000 | [diff] [blame] | 126 |           m_pFormFillEnv->GetPDFDocument())) { | 
 | 127 |   ASSERT(m_pFormFillEnv); | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 128 |   m_pInteractiveForm->SetFormNotify(this); | 
| Ryan Harrison | 9baf31f | 2018-01-12 18:36:30 +0000 | [diff] [blame] | 129 |   RemoveAllHighLights(); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 130 | } | 
 | 131 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 132 | CPDFSDK_InteractiveForm::~CPDFSDK_InteractiveForm() { | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 133 |   m_Map.clear(); | 
 | 134 | #ifdef PDF_ENABLE_XFA | 
 | 135 |   m_XFAMap.clear(); | 
 | 136 | #endif  // PDF_ENABLE_XFA | 
 | 137 | } | 
 | 138 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 139 | CPDFSDK_Widget* CPDFSDK_InteractiveForm::GetSibling(CPDFSDK_Widget* pWidget, | 
 | 140 |                                                     bool bNext) const { | 
| Dan Sinclair | cbf76e6 | 2018-03-28 21:00:35 +0000 | [diff] [blame] | 141 |   auto pIterator = pdfium::MakeUnique<CPDFSDK_AnnotIterator>( | 
| Dan Sinclair | 0bb1333 | 2017-03-30 16:12:02 -0400 | [diff] [blame] | 142 |       pWidget->GetPageView(), CPDF_Annot::Subtype::WIDGET); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 143 |  | 
| Tom Sepez | 4ef943b | 2018-07-26 19:06:06 +0000 | [diff] [blame] | 144 |   return ToCPDFSDKWidget(bNext ? pIterator->GetNextAnnot(pWidget) | 
 | 145 |                                : pIterator->GetPrevAnnot(pWidget)); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 146 | } | 
 | 147 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 148 | CPDFSDK_Widget* CPDFSDK_InteractiveForm::GetWidget( | 
 | 149 |     CPDF_FormControl* pControl) const { | 
| Lei Zhang | 461acb2 | 2018-10-10 18:38:03 +0000 | [diff] [blame] | 150 |   if (!pControl) | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 151 |     return nullptr; | 
 | 152 |  | 
 | 153 |   CPDFSDK_Widget* pWidget = nullptr; | 
 | 154 |   const auto it = m_Map.find(pControl); | 
 | 155 |   if (it != m_Map.end()) | 
 | 156 |     pWidget = it->second; | 
 | 157 |   if (pWidget) | 
 | 158 |     return pWidget; | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 159 |  | 
 | 160 |   CPDF_Dictionary* pControlDict = pControl->GetWidget(); | 
| dsinclair | 7cbe68e | 2016-10-12 11:56:23 -0700 | [diff] [blame] | 161 |   CPDF_Document* pDocument = m_pFormFillEnv->GetPDFDocument(); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 162 |   CPDFSDK_PageView* pPage = nullptr; | 
 | 163 |  | 
| dsinclair | 38fd844 | 2016-09-15 10:15:32 -0700 | [diff] [blame] | 164 |   if (CPDF_Dictionary* pPageDict = pControlDict->GetDictFor("P")) { | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 165 |     int nPageIndex = pDocument->GetPageIndex(pPageDict->GetObjNum()); | 
 | 166 |     if (nPageIndex >= 0) | 
| dsinclair | 7cbe68e | 2016-10-12 11:56:23 -0700 | [diff] [blame] | 167 |       pPage = m_pFormFillEnv->GetPageView(nPageIndex); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 168 |   } | 
 | 169 |  | 
 | 170 |   if (!pPage) { | 
 | 171 |     int nPageIndex = GetPageIndexByAnnotDict(pDocument, pControlDict); | 
 | 172 |     if (nPageIndex >= 0) | 
| dsinclair | 7cbe68e | 2016-10-12 11:56:23 -0700 | [diff] [blame] | 173 |       pPage = m_pFormFillEnv->GetPageView(nPageIndex); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 174 |   } | 
 | 175 |  | 
| Tom Sepez | 4ef943b | 2018-07-26 19:06:06 +0000 | [diff] [blame] | 176 |   return pPage ? ToCPDFSDKWidget(pPage->GetAnnotByDict(pControlDict)) : nullptr; | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 177 | } | 
 | 178 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 179 | void CPDFSDK_InteractiveForm::GetWidgets( | 
| Ryan Harrison | 275e260 | 2017-09-18 14:23:18 -0400 | [diff] [blame] | 180 |     const WideString& sFieldName, | 
| tsepez | 8fa8279 | 2017-01-11 09:32:33 -0800 | [diff] [blame] | 181 |     std::vector<CPDFSDK_Annot::ObservedPtr>* widgets) const { | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 182 |   for (int i = 0, sz = m_pInteractiveForm->CountFields(sFieldName); i < sz; | 
 | 183 |        ++i) { | 
 | 184 |     CPDF_FormField* pFormField = m_pInteractiveForm->GetField(i, sFieldName); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 185 |     ASSERT(pFormField); | 
 | 186 |     GetWidgets(pFormField, widgets); | 
 | 187 |   } | 
 | 188 | } | 
 | 189 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 190 | void CPDFSDK_InteractiveForm::GetWidgets( | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 191 |     CPDF_FormField* pField, | 
| tsepez | 8fa8279 | 2017-01-11 09:32:33 -0800 | [diff] [blame] | 192 |     std::vector<CPDFSDK_Annot::ObservedPtr>* widgets) const { | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 193 |   for (int i = 0, sz = pField->CountControls(); i < sz; ++i) { | 
 | 194 |     CPDF_FormControl* pFormCtrl = pField->GetControl(i); | 
 | 195 |     ASSERT(pFormCtrl); | 
| dsinclair | c5267c5 | 2016-11-04 15:35:12 -0700 | [diff] [blame] | 196 |     CPDFSDK_Widget* pWidget = GetWidget(pFormCtrl); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 197 |     if (pWidget) | 
| tsepez | 8fa8279 | 2017-01-11 09:32:33 -0800 | [diff] [blame] | 198 |       widgets->emplace_back(pWidget); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 199 |   } | 
 | 200 | } | 
 | 201 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 202 | int CPDFSDK_InteractiveForm::GetPageIndexByAnnotDict( | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 203 |     CPDF_Document* pDocument, | 
 | 204 |     CPDF_Dictionary* pAnnotDict) const { | 
 | 205 |   ASSERT(pAnnotDict); | 
 | 206 |  | 
 | 207 |   for (int i = 0, sz = pDocument->GetPageCount(); i < sz; i++) { | 
| Tom Sepez | 967aa07 | 2018-05-08 13:40:20 +0000 | [diff] [blame] | 208 |     if (CPDF_Dictionary* pPageDict = pDocument->GetPageDictionary(i)) { | 
| dsinclair | 38fd844 | 2016-09-15 10:15:32 -0700 | [diff] [blame] | 209 |       if (CPDF_Array* pAnnots = pPageDict->GetArrayFor("Annots")) { | 
| Lei Zhang | f40380f | 2018-10-12 18:31:51 +0000 | [diff] [blame] | 210 |         for (int j = 0, jsz = pAnnots->size(); j < jsz; j++) { | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 211 |           CPDF_Object* pDict = pAnnots->GetDirectObjectAt(j); | 
 | 212 |           if (pAnnotDict == pDict) | 
 | 213 |             return i; | 
 | 214 |         } | 
 | 215 |       } | 
 | 216 |     } | 
 | 217 |   } | 
 | 218 |  | 
 | 219 |   return -1; | 
 | 220 | } | 
 | 221 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 222 | void CPDFSDK_InteractiveForm::AddMap(CPDF_FormControl* pControl, | 
 | 223 |                                      CPDFSDK_Widget* pWidget) { | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 224 |   m_Map[pControl] = pWidget; | 
 | 225 | } | 
 | 226 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 227 | void CPDFSDK_InteractiveForm::RemoveMap(CPDF_FormControl* pControl) { | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 228 |   m_Map.erase(pControl); | 
 | 229 | } | 
 | 230 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 231 | void CPDFSDK_InteractiveForm::EnableCalculate(bool bEnabled) { | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 232 |   m_bCalculate = bEnabled; | 
 | 233 | } | 
 | 234 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 235 | bool CPDFSDK_InteractiveForm::IsCalculateEnabled() const { | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 236 |   return m_bCalculate; | 
 | 237 | } | 
 | 238 |  | 
 | 239 | #ifdef PDF_ENABLE_XFA | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 240 | void CPDFSDK_InteractiveForm::AddXFAMap(CXFA_FFWidget* hWidget, | 
 | 241 |                                         CPDFSDK_XFAWidget* pWidget) { | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 242 |   ASSERT(hWidget); | 
 | 243 |   m_XFAMap[hWidget] = pWidget; | 
 | 244 | } | 
 | 245 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 246 | void CPDFSDK_InteractiveForm::RemoveXFAMap(CXFA_FFWidget* hWidget) { | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 247 |   ASSERT(hWidget); | 
 | 248 |   m_XFAMap.erase(hWidget); | 
 | 249 | } | 
 | 250 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 251 | CPDFSDK_XFAWidget* CPDFSDK_InteractiveForm::GetXFAWidget( | 
 | 252 |     CXFA_FFWidget* hWidget) { | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 253 |   ASSERT(hWidget); | 
 | 254 |   auto it = m_XFAMap.find(hWidget); | 
 | 255 |   return it != m_XFAMap.end() ? it->second : nullptr; | 
 | 256 | } | 
 | 257 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 258 | void CPDFSDK_InteractiveForm::XfaEnableCalculate(bool bEnabled) { | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 259 |   m_bXfaCalculate = bEnabled; | 
 | 260 | } | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 261 | bool CPDFSDK_InteractiveForm::IsXfaCalculateEnabled() const { | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 262 |   return m_bXfaCalculate; | 
 | 263 | } | 
 | 264 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 265 | bool CPDFSDK_InteractiveForm::IsXfaValidationsEnabled() { | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 266 |   return m_bXfaValidationsEnabled; | 
 | 267 | } | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 268 | void CPDFSDK_InteractiveForm::XfaSetValidationsEnabled(bool bEnabled) { | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 269 |   m_bXfaValidationsEnabled = bEnabled; | 
 | 270 | } | 
 | 271 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 272 | void CPDFSDK_InteractiveForm::SynchronizeField(CPDF_FormField* pFormField) { | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 273 |   for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) { | 
 | 274 |     CPDF_FormControl* pFormCtrl = pFormField->GetControl(i); | 
| dsinclair | c5267c5 | 2016-11-04 15:35:12 -0700 | [diff] [blame] | 275 |     if (CPDFSDK_Widget* pWidget = GetWidget(pFormCtrl)) | 
| Dan Sinclair | ce047a6 | 2018-01-30 18:15:02 +0000 | [diff] [blame] | 276 |       pWidget->Synchronize(false); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 277 |   } | 
 | 278 | } | 
 | 279 | #endif  // PDF_ENABLE_XFA | 
 | 280 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 281 | void CPDFSDK_InteractiveForm::OnCalculate(CPDF_FormField* pFormField) { | 
| Tom Sepez | f5ca90c | 2018-02-01 02:15:44 +0000 | [diff] [blame] | 282 |   if (!m_pFormFillEnv->IsJSPlatformPresent()) | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 283 |     return; | 
 | 284 |  | 
 | 285 |   if (m_bBusy) | 
 | 286 |     return; | 
 | 287 |  | 
| Tom Sepez | c22d671 | 2018-06-05 22:33:31 +0000 | [diff] [blame] | 288 |   AutoRestorer<bool> restorer(&m_bBusy); | 
| tsepez | 4cf5515 | 2016-11-02 14:37:54 -0700 | [diff] [blame] | 289 |   m_bBusy = true; | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 290 |  | 
| Tom Sepez | c22d671 | 2018-06-05 22:33:31 +0000 | [diff] [blame] | 291 |   if (!IsCalculateEnabled()) | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 292 |     return; | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 293 |  | 
| Tom Sepez | f5ca90c | 2018-02-01 02:15:44 +0000 | [diff] [blame] | 294 |   IJS_Runtime* pRuntime = m_pFormFillEnv->GetIJSRuntime(); | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 295 |   int nSize = m_pInteractiveForm->CountFieldsInCalculationOrder(); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 296 |   for (int i = 0; i < nSize; i++) { | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 297 |     CPDF_FormField* pField = m_pInteractiveForm->GetFieldInCalculationOrder(i); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 298 |     if (!pField) | 
 | 299 |       continue; | 
 | 300 |  | 
| Ryan Harrison | 9baf31f | 2018-01-12 18:36:30 +0000 | [diff] [blame] | 301 |     FormFieldType fieldType = pField->GetFieldType(); | 
 | 302 |     if (!IsFormFieldTypeComboOrText(fieldType)) | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 303 |       continue; | 
 | 304 |  | 
 | 305 |     CPDF_AAction aAction = pField->GetAdditionalAction(); | 
| Hans Wennborg | c320e9c | 2018-10-22 18:28:52 +0000 | [diff] [blame^] | 306 |     if (!aAction.GetDict() || !aAction.ActionExist(CPDF_AAction::kCalculate)) | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 307 |       continue; | 
 | 308 |  | 
| Hans Wennborg | c320e9c | 2018-10-22 18:28:52 +0000 | [diff] [blame^] | 309 |     CPDF_Action action = aAction.GetAction(CPDF_AAction::kCalculate); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 310 |     if (!action.GetDict()) | 
 | 311 |       continue; | 
 | 312 |  | 
| Ryan Harrison | 275e260 | 2017-09-18 14:23:18 -0400 | [diff] [blame] | 313 |     WideString csJS = action.GetJavaScript(); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 314 |     if (csJS.IsEmpty()) | 
 | 315 |       continue; | 
 | 316 |  | 
| Ryan Harrison | 275e260 | 2017-09-18 14:23:18 -0400 | [diff] [blame] | 317 |     WideString sOldValue = pField->GetValue(); | 
 | 318 |     WideString sValue = sOldValue; | 
| tsepez | 4cf5515 | 2016-11-02 14:37:54 -0700 | [diff] [blame] | 319 |     bool bRC = true; | 
| Tom Sepez | c22d671 | 2018-06-05 22:33:31 +0000 | [diff] [blame] | 320 |     IJS_Runtime::ScopedEventContext pContext(pRuntime); | 
| Tom Sepez | 3d81315 | 2018-06-21 17:28:24 +0000 | [diff] [blame] | 321 |     pContext->OnField_Calculate(pFormField, pField, &sValue, &bRC); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 322 |  | 
| Dan Sinclair | dc5d88b | 2018-05-17 13:53:52 +0000 | [diff] [blame] | 323 |     Optional<IJS_Runtime::JS_Error> err = pContext->RunScript(csJS); | 
| Dan Sinclair | dc5d88b | 2018-05-17 13:53:52 +0000 | [diff] [blame] | 324 |     if (!err && bRC && sValue.Compare(sOldValue) != 0) | 
| Tom Sepez | b2e6b4c | 2018-08-16 20:53:58 +0000 | [diff] [blame] | 325 |       pField->SetValue(sValue, NotificationOption::kNotify); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 326 |   } | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 327 | } | 
 | 328 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 329 | Optional<WideString> CPDFSDK_InteractiveForm::OnFormat( | 
 | 330 |     CPDF_FormField* pFormField) { | 
| Lei Zhang | 4f261ff | 2018-10-10 18:44:45 +0000 | [diff] [blame] | 331 |   if (!m_pFormFillEnv->IsJSPlatformPresent()) | 
 | 332 |     return {}; | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 333 |  | 
| Lei Zhang | 4f261ff | 2018-10-10 18:44:45 +0000 | [diff] [blame] | 334 |   WideString sValue = pFormField->GetValue(); | 
| Tom Sepez | f5ca90c | 2018-02-01 02:15:44 +0000 | [diff] [blame] | 335 |   IJS_Runtime* pRuntime = m_pFormFillEnv->GetIJSRuntime(); | 
| Ryan Harrison | 9baf31f | 2018-01-12 18:36:30 +0000 | [diff] [blame] | 336 |   if (pFormField->GetFieldType() == FormFieldType::kComboBox && | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 337 |       pFormField->CountSelectedItems() > 0) { | 
 | 338 |     int index = pFormField->GetSelectedIndex(0); | 
 | 339 |     if (index >= 0) | 
 | 340 |       sValue = pFormField->GetOptionLabel(index); | 
 | 341 |   } | 
 | 342 |  | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 343 |   CPDF_AAction aAction = pFormField->GetAdditionalAction(); | 
| Hans Wennborg | c320e9c | 2018-10-22 18:28:52 +0000 | [diff] [blame^] | 344 |   if (aAction.GetDict() && aAction.ActionExist(CPDF_AAction::kFormat)) { | 
 | 345 |     CPDF_Action action = aAction.GetAction(CPDF_AAction::kFormat); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 346 |     if (action.GetDict()) { | 
| Ryan Harrison | 275e260 | 2017-09-18 14:23:18 -0400 | [diff] [blame] | 347 |       WideString script = action.GetJavaScript(); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 348 |       if (!script.IsEmpty()) { | 
| Tom Sepez | c22d671 | 2018-06-05 22:33:31 +0000 | [diff] [blame] | 349 |         IJS_Runtime::ScopedEventContext pContext(pRuntime); | 
| Lei Zhang | 4f261ff | 2018-10-10 18:44:45 +0000 | [diff] [blame] | 350 |         pContext->OnField_Format(pFormField, &sValue, true); | 
| Dan Sinclair | dc5d88b | 2018-05-17 13:53:52 +0000 | [diff] [blame] | 351 |         Optional<IJS_Runtime::JS_Error> err = pContext->RunScript(script); | 
| Lei Zhang | 4f261ff | 2018-10-10 18:44:45 +0000 | [diff] [blame] | 352 |         if (!err) | 
 | 353 |           return sValue; | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 354 |       } | 
 | 355 |     } | 
 | 356 |   } | 
| Lei Zhang | 4f261ff | 2018-10-10 18:44:45 +0000 | [diff] [blame] | 357 |   return {}; | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 358 | } | 
 | 359 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 360 | void CPDFSDK_InteractiveForm::ResetFieldAppearance(CPDF_FormField* pFormField, | 
 | 361 |                                                    Optional<WideString> sValue, | 
 | 362 |                                                    bool bValueChanged) { | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 363 |   for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) { | 
 | 364 |     CPDF_FormControl* pFormCtrl = pFormField->GetControl(i); | 
 | 365 |     ASSERT(pFormCtrl); | 
| dsinclair | c5267c5 | 2016-11-04 15:35:12 -0700 | [diff] [blame] | 366 |     if (CPDFSDK_Widget* pWidget = GetWidget(pFormCtrl)) | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 367 |       pWidget->ResetAppearance(sValue, bValueChanged); | 
 | 368 |   } | 
 | 369 | } | 
 | 370 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 371 | void CPDFSDK_InteractiveForm::UpdateField(CPDF_FormField* pFormField) { | 
| Lei Zhang | 375c276 | 2017-03-10 14:37:14 -0800 | [diff] [blame] | 372 |   auto* formfiller = m_pFormFillEnv->GetInteractiveFormFiller(); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 373 |   for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) { | 
 | 374 |     CPDF_FormControl* pFormCtrl = pFormField->GetControl(i); | 
 | 375 |     ASSERT(pFormCtrl); | 
 | 376 |  | 
| Lei Zhang | 77f9bff | 2017-08-29 11:34:12 -0700 | [diff] [blame] | 377 |     CPDFSDK_Widget* pWidget = GetWidget(pFormCtrl); | 
 | 378 |     if (!pWidget) | 
 | 379 |       continue; | 
 | 380 |  | 
| Tom Sepez | 101535f | 2018-06-12 13:36:05 +0000 | [diff] [blame] | 381 |     IPDF_Page* pPage = pWidget->GetPage(); | 
| Lei Zhang | 77f9bff | 2017-08-29 11:34:12 -0700 | [diff] [blame] | 382 |     FX_RECT rect = formfiller->GetViewBBox( | 
 | 383 |         m_pFormFillEnv->GetPageView(pPage, false), pWidget); | 
 | 384 |     m_pFormFillEnv->Invalidate(pPage, rect); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 385 |   } | 
 | 386 | } | 
 | 387 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 388 | bool CPDFSDK_InteractiveForm::OnKeyStrokeCommit(CPDF_FormField* pFormField, | 
 | 389 |                                                 const WideString& csValue) { | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 390 |   CPDF_AAction aAction = pFormField->GetAdditionalAction(); | 
| Hans Wennborg | c320e9c | 2018-10-22 18:28:52 +0000 | [diff] [blame^] | 391 |   if (!aAction.GetDict() || !aAction.ActionExist(CPDF_AAction::kKeyStroke)) | 
| tsepez | 4cf5515 | 2016-11-02 14:37:54 -0700 | [diff] [blame] | 392 |     return true; | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 393 |  | 
| Hans Wennborg | c320e9c | 2018-10-22 18:28:52 +0000 | [diff] [blame^] | 394 |   CPDF_Action action = aAction.GetAction(CPDF_AAction::kKeyStroke); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 395 |   if (!action.GetDict()) | 
| tsepez | 4cf5515 | 2016-11-02 14:37:54 -0700 | [diff] [blame] | 396 |     return true; | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 397 |  | 
| Dan Sinclair | 7d12532 | 2018-03-28 18:49:34 +0000 | [diff] [blame] | 398 |   CPDFSDK_FieldAction fa; | 
| Lei Zhang | 60fa2fc | 2017-07-21 17:42:19 -0700 | [diff] [blame] | 399 |   fa.bModifier = false; | 
 | 400 |   fa.bShift = false; | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 401 |   fa.sValue = csValue; | 
| Lei Zhang | 7db136a | 2018-10-10 21:34:17 +0000 | [diff] [blame] | 402 |   m_pFormFillEnv->GetActionHandler()->DoAction_FieldJavaScript( | 
| Hans Wennborg | c320e9c | 2018-10-22 18:28:52 +0000 | [diff] [blame^] | 403 |       action, CPDF_AAction::kKeyStroke, m_pFormFillEnv.Get(), pFormField, &fa); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 404 |   return fa.bRC; | 
 | 405 | } | 
 | 406 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 407 | bool CPDFSDK_InteractiveForm::OnValidate(CPDF_FormField* pFormField, | 
 | 408 |                                          const WideString& csValue) { | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 409 |   CPDF_AAction aAction = pFormField->GetAdditionalAction(); | 
| Hans Wennborg | c320e9c | 2018-10-22 18:28:52 +0000 | [diff] [blame^] | 410 |   if (!aAction.GetDict() || !aAction.ActionExist(CPDF_AAction::kValidate)) | 
| tsepez | 4cf5515 | 2016-11-02 14:37:54 -0700 | [diff] [blame] | 411 |     return true; | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 412 |  | 
| Hans Wennborg | c320e9c | 2018-10-22 18:28:52 +0000 | [diff] [blame^] | 413 |   CPDF_Action action = aAction.GetAction(CPDF_AAction::kValidate); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 414 |   if (!action.GetDict()) | 
| tsepez | 4cf5515 | 2016-11-02 14:37:54 -0700 | [diff] [blame] | 415 |     return true; | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 416 |  | 
| Dan Sinclair | 7d12532 | 2018-03-28 18:49:34 +0000 | [diff] [blame] | 417 |   CPDFSDK_FieldAction fa; | 
| Lei Zhang | 60fa2fc | 2017-07-21 17:42:19 -0700 | [diff] [blame] | 418 |   fa.bModifier = false; | 
 | 419 |   fa.bShift = false; | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 420 |   fa.sValue = csValue; | 
| Lei Zhang | 7db136a | 2018-10-10 21:34:17 +0000 | [diff] [blame] | 421 |   m_pFormFillEnv->GetActionHandler()->DoAction_FieldJavaScript( | 
| Hans Wennborg | c320e9c | 2018-10-22 18:28:52 +0000 | [diff] [blame^] | 422 |       action, CPDF_AAction::kValidate, m_pFormFillEnv.Get(), pFormField, &fa); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 423 |   return fa.bRC; | 
 | 424 | } | 
 | 425 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 426 | bool CPDFSDK_InteractiveForm::DoAction_Hide(const CPDF_Action& action) { | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 427 |   ASSERT(action.GetDict()); | 
 | 428 |  | 
 | 429 |   CPDF_ActionFields af(&action); | 
| Lei Zhang | 5cee3f2 | 2018-05-25 21:48:49 +0000 | [diff] [blame] | 430 |   std::vector<const CPDF_Object*> fieldObjects = af.GetAllFields(); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 431 |   std::vector<CPDF_FormField*> fields = GetFieldFromObjects(fieldObjects); | 
 | 432 |  | 
 | 433 |   bool bHide = action.GetHideStatus(); | 
| tsepez | 4cf5515 | 2016-11-02 14:37:54 -0700 | [diff] [blame] | 434 |   bool bChanged = false; | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 435 |  | 
 | 436 |   for (CPDF_FormField* pField : fields) { | 
 | 437 |     for (int i = 0, sz = pField->CountControls(); i < sz; ++i) { | 
 | 438 |       CPDF_FormControl* pControl = pField->GetControl(i); | 
 | 439 |       ASSERT(pControl); | 
 | 440 |  | 
| dsinclair | c5267c5 | 2016-11-04 15:35:12 -0700 | [diff] [blame] | 441 |       if (CPDFSDK_Widget* pWidget = GetWidget(pControl)) { | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 442 |         uint32_t nFlags = pWidget->GetFlags(); | 
 | 443 |         nFlags &= ~ANNOTFLAG_INVISIBLE; | 
 | 444 |         nFlags &= ~ANNOTFLAG_NOVIEW; | 
 | 445 |         if (bHide) | 
 | 446 |           nFlags |= ANNOTFLAG_HIDDEN; | 
 | 447 |         else | 
 | 448 |           nFlags &= ~ANNOTFLAG_HIDDEN; | 
 | 449 |         pWidget->SetFlags(nFlags); | 
 | 450 |         pWidget->GetPageView()->UpdateView(pWidget); | 
| tsepez | 4cf5515 | 2016-11-02 14:37:54 -0700 | [diff] [blame] | 451 |         bChanged = true; | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 452 |       } | 
 | 453 |     } | 
 | 454 |   } | 
 | 455 |  | 
 | 456 |   return bChanged; | 
 | 457 | } | 
 | 458 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 459 | bool CPDFSDK_InteractiveForm::DoAction_SubmitForm(const CPDF_Action& action) { | 
| Ryan Harrison | 275e260 | 2017-09-18 14:23:18 -0400 | [diff] [blame] | 460 |   WideString sDestination = action.GetFilePath(); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 461 |   if (sDestination.IsEmpty()) | 
| tsepez | 4cf5515 | 2016-11-02 14:37:54 -0700 | [diff] [blame] | 462 |     return false; | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 463 |  | 
| Lei Zhang | 5cee3f2 | 2018-05-25 21:48:49 +0000 | [diff] [blame] | 464 |   const CPDF_Dictionary* pActionDict = action.GetDict(); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 465 |   if (pActionDict->KeyExist("Fields")) { | 
 | 466 |     CPDF_ActionFields af(&action); | 
 | 467 |     uint32_t dwFlags = action.GetFlags(); | 
| Lei Zhang | 5cee3f2 | 2018-05-25 21:48:49 +0000 | [diff] [blame] | 468 |     std::vector<const CPDF_Object*> fieldObjects = af.GetAllFields(); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 469 |     std::vector<CPDF_FormField*> fields = GetFieldFromObjects(fieldObjects); | 
 | 470 |     if (!fields.empty()) { | 
 | 471 |       bool bIncludeOrExclude = !(dwFlags & 0x01); | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 472 |       if (!m_pInteractiveForm->CheckRequiredFields(&fields, bIncludeOrExclude)) | 
| tsepez | 4cf5515 | 2016-11-02 14:37:54 -0700 | [diff] [blame] | 473 |         return false; | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 474 |  | 
 | 475 |       return SubmitFields(sDestination, fields, bIncludeOrExclude, false); | 
 | 476 |     } | 
 | 477 |   } | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 478 |   if (!m_pInteractiveForm->CheckRequiredFields(nullptr, true)) | 
| tsepez | 4cf5515 | 2016-11-02 14:37:54 -0700 | [diff] [blame] | 479 |     return false; | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 480 |  | 
| tsepez | 4cf5515 | 2016-11-02 14:37:54 -0700 | [diff] [blame] | 481 |   return SubmitForm(sDestination, false); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 482 | } | 
 | 483 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 484 | bool CPDFSDK_InteractiveForm::SubmitFields( | 
 | 485 |     const WideString& csDestination, | 
 | 486 |     const std::vector<CPDF_FormField*>& fields, | 
 | 487 |     bool bIncludeOrExclude, | 
 | 488 |     bool bUrlEncoded) { | 
| Ryan Harrison | 275e260 | 2017-09-18 14:23:18 -0400 | [diff] [blame] | 489 |   ByteString textBuf = ExportFieldsToFDFTextBuf(fields, bIncludeOrExclude); | 
| Tom Sepez | 65be34f | 2018-09-14 20:58:36 +0000 | [diff] [blame] | 490 |   if (textBuf.IsEmpty()) | 
| Henrique Nakashima | aea80dc | 2017-08-01 19:47:24 -0400 | [diff] [blame] | 491 |     return false; | 
| Henrique Nakashima | aea80dc | 2017-08-01 19:47:24 -0400 | [diff] [blame] | 492 |  | 
| Tom Sepez | 65be34f | 2018-09-14 20:58:36 +0000 | [diff] [blame] | 493 |   std::vector<uint8_t> buffer(textBuf.begin(), textBuf.end()); | 
| Lei Zhang | 2ee811f | 2018-08-13 21:32:50 +0000 | [diff] [blame] | 494 |   if (bUrlEncoded && !FDFToURLEncodedData(&buffer)) | 
| Henrique Nakashima | 5c09f4c | 2017-08-04 12:28:52 -0400 | [diff] [blame] | 495 |     return false; | 
| Henrique Nakashima | 5c09f4c | 2017-08-04 12:28:52 -0400 | [diff] [blame] | 496 |  | 
| Lei Zhang | 2ee811f | 2018-08-13 21:32:50 +0000 | [diff] [blame] | 497 |   m_pFormFillEnv->JS_docSubmitForm(buffer.data(), buffer.size(), csDestination); | 
| tsepez | 4cf5515 | 2016-11-02 14:37:54 -0700 | [diff] [blame] | 498 |   return true; | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 499 | } | 
 | 500 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 501 | ByteString CPDFSDK_InteractiveForm::ExportFieldsToFDFTextBuf( | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 502 |     const std::vector<CPDF_FormField*>& fields, | 
| Henrique Nakashima | 5c09f4c | 2017-08-04 12:28:52 -0400 | [diff] [blame] | 503 |     bool bIncludeOrExclude) { | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 504 |   std::unique_ptr<CFDF_Document> pFDF = m_pInteractiveForm->ExportToFDF( | 
| Tom Sepez | 690d456 | 2017-05-18 11:42:46 -0700 | [diff] [blame] | 505 |       m_pFormFillEnv->JS_docGetFilePath(), fields, bIncludeOrExclude, false); | 
| Henrique Nakashima | 5c09f4c | 2017-08-04 12:28:52 -0400 | [diff] [blame] | 506 |  | 
| Ryan Harrison | 275e260 | 2017-09-18 14:23:18 -0400 | [diff] [blame] | 507 |   return pFDF ? pFDF->WriteToString() : ByteString(); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 508 | } | 
 | 509 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 510 | bool CPDFSDK_InteractiveForm::SubmitForm(const WideString& sDestination, | 
 | 511 |                                          bool bUrlEncoded) { | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 512 |   if (sDestination.IsEmpty()) | 
| tsepez | 4cf5515 | 2016-11-02 14:37:54 -0700 | [diff] [blame] | 513 |     return false; | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 514 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 515 |   std::unique_ptr<CFDF_Document> pFDFDoc = m_pInteractiveForm->ExportToFDF( | 
 | 516 |       m_pFormFillEnv->JS_docGetFilePath(), false); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 517 |   if (!pFDFDoc) | 
| tsepez | 4cf5515 | 2016-11-02 14:37:54 -0700 | [diff] [blame] | 518 |     return false; | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 519 |  | 
| Ryan Harrison | 275e260 | 2017-09-18 14:23:18 -0400 | [diff] [blame] | 520 |   ByteString fdfBuffer = pFDFDoc->WriteToString(); | 
| Ryan Harrison | 875e98c | 2017-09-27 10:53:11 -0400 | [diff] [blame] | 521 |   if (fdfBuffer.IsEmpty()) | 
| tsepez | 4cf5515 | 2016-11-02 14:37:54 -0700 | [diff] [blame] | 522 |     return false; | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 523 |  | 
| Tom Sepez | 65be34f | 2018-09-14 20:58:36 +0000 | [diff] [blame] | 524 |   std::vector<uint8_t> buffer(fdfBuffer.begin(), fdfBuffer.end()); | 
| Lei Zhang | 2ee811f | 2018-08-13 21:32:50 +0000 | [diff] [blame] | 525 |   if (bUrlEncoded && !FDFToURLEncodedData(&buffer)) | 
| tsepez | 4cf5515 | 2016-11-02 14:37:54 -0700 | [diff] [blame] | 526 |     return false; | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 527 |  | 
| Lei Zhang | 2ee811f | 2018-08-13 21:32:50 +0000 | [diff] [blame] | 528 |   m_pFormFillEnv->JS_docSubmitForm(buffer.data(), buffer.size(), sDestination); | 
| tsepez | 4cf5515 | 2016-11-02 14:37:54 -0700 | [diff] [blame] | 529 |   return true; | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 530 | } | 
 | 531 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 532 | ByteString CPDFSDK_InteractiveForm::ExportFormToFDFTextBuf() { | 
 | 533 |   std::unique_ptr<CFDF_Document> pFDF = m_pInteractiveForm->ExportToFDF( | 
 | 534 |       m_pFormFillEnv->JS_docGetFilePath(), false); | 
| Henrique Nakashima | 5c09f4c | 2017-08-04 12:28:52 -0400 | [diff] [blame] | 535 |  | 
| Ryan Harrison | 275e260 | 2017-09-18 14:23:18 -0400 | [diff] [blame] | 536 |   return pFDF ? pFDF->WriteToString() : ByteString(); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 537 | } | 
 | 538 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 539 | void CPDFSDK_InteractiveForm::DoAction_ResetForm(const CPDF_Action& action) { | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 540 |   ASSERT(action.GetDict()); | 
| Lei Zhang | 5cee3f2 | 2018-05-25 21:48:49 +0000 | [diff] [blame] | 541 |   const CPDF_Dictionary* pActionDict = action.GetDict(); | 
| dan sinclair | 7544a4b | 2018-03-08 15:19:50 +0000 | [diff] [blame] | 542 |   if (!pActionDict->KeyExist("Fields")) { | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 543 |     m_pInteractiveForm->ResetForm(NotificationOption::kNotify); | 
| dan sinclair | 7544a4b | 2018-03-08 15:19:50 +0000 | [diff] [blame] | 544 |     return; | 
 | 545 |   } | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 546 |   CPDF_ActionFields af(&action); | 
 | 547 |   uint32_t dwFlags = action.GetFlags(); | 
| Lei Zhang | 5cee3f2 | 2018-05-25 21:48:49 +0000 | [diff] [blame] | 548 |   std::vector<const CPDF_Object*> fieldObjects = af.GetAllFields(); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 549 |   std::vector<CPDF_FormField*> fields = GetFieldFromObjects(fieldObjects); | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 550 |   m_pInteractiveForm->ResetForm(fields, !(dwFlags & 0x01), | 
 | 551 |                                 NotificationOption::kNotify); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 552 | } | 
 | 553 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 554 | std::vector<CPDF_FormField*> CPDFSDK_InteractiveForm::GetFieldFromObjects( | 
| Lei Zhang | 5cee3f2 | 2018-05-25 21:48:49 +0000 | [diff] [blame] | 555 |     const std::vector<const CPDF_Object*>& objects) const { | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 556 |   std::vector<CPDF_FormField*> fields; | 
| Lei Zhang | 5cee3f2 | 2018-05-25 21:48:49 +0000 | [diff] [blame] | 557 |   for (const CPDF_Object* pObject : objects) { | 
| Dan Sinclair | ce047a6 | 2018-01-30 18:15:02 +0000 | [diff] [blame] | 558 |     if (!pObject || !pObject->IsString()) | 
 | 559 |       continue; | 
 | 560 |  | 
 | 561 |     WideString csName = pObject->GetUnicodeText(); | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 562 |     CPDF_FormField* pField = m_pInteractiveForm->GetField(0, csName); | 
| Dan Sinclair | ce047a6 | 2018-01-30 18:15:02 +0000 | [diff] [blame] | 563 |     if (pField) | 
 | 564 |       fields.push_back(pField); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 565 |   } | 
 | 566 |   return fields; | 
 | 567 | } | 
 | 568 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 569 | bool CPDFSDK_InteractiveForm::BeforeValueChange(CPDF_FormField* pField, | 
 | 570 |                                                 const WideString& csValue) { | 
| Ryan Harrison | 9baf31f | 2018-01-12 18:36:30 +0000 | [diff] [blame] | 571 |   FormFieldType fieldType = pField->GetFieldType(); | 
 | 572 |   if (!IsFormFieldTypeComboOrText(fieldType)) | 
| dan sinclair | 507fb4e | 2018-03-08 15:14:09 +0000 | [diff] [blame] | 573 |     return true; | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 574 |   if (!OnKeyStrokeCommit(pField, csValue)) | 
| dan sinclair | 507fb4e | 2018-03-08 15:14:09 +0000 | [diff] [blame] | 575 |     return false; | 
 | 576 |   return OnValidate(pField, csValue); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 577 | } | 
 | 578 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 579 | void CPDFSDK_InteractiveForm::AfterValueChange(CPDF_FormField* pField) { | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 580 | #ifdef PDF_ENABLE_XFA | 
| Dan Sinclair | ce047a6 | 2018-01-30 18:15:02 +0000 | [diff] [blame] | 581 |   SynchronizeField(pField); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 582 | #endif  // PDF_ENABLE_XFA | 
| Dan Sinclair | ce047a6 | 2018-01-30 18:15:02 +0000 | [diff] [blame] | 583 |  | 
| Ryan Harrison | 9baf31f | 2018-01-12 18:36:30 +0000 | [diff] [blame] | 584 |   FormFieldType fieldType = pField->GetFieldType(); | 
| Dan Sinclair | ce047a6 | 2018-01-30 18:15:02 +0000 | [diff] [blame] | 585 |   if (!IsFormFieldTypeComboOrText(fieldType)) | 
 | 586 |     return; | 
 | 587 |  | 
 | 588 |   OnCalculate(pField); | 
| Lei Zhang | 4f261ff | 2018-10-10 18:44:45 +0000 | [diff] [blame] | 589 |   ResetFieldAppearance(pField, OnFormat(pField), true); | 
| Dan Sinclair | ce047a6 | 2018-01-30 18:15:02 +0000 | [diff] [blame] | 590 |   UpdateField(pField); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 591 | } | 
 | 592 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 593 | bool CPDFSDK_InteractiveForm::BeforeSelectionChange(CPDF_FormField* pField, | 
 | 594 |                                                     const WideString& csValue) { | 
| Ryan Harrison | 9baf31f | 2018-01-12 18:36:30 +0000 | [diff] [blame] | 595 |   if (pField->GetFieldType() != FormFieldType::kListBox) | 
| dan sinclair | 507fb4e | 2018-03-08 15:14:09 +0000 | [diff] [blame] | 596 |     return true; | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 597 |   if (!OnKeyStrokeCommit(pField, csValue)) | 
| dan sinclair | 507fb4e | 2018-03-08 15:14:09 +0000 | [diff] [blame] | 598 |     return false; | 
 | 599 |   return OnValidate(pField, csValue); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 600 | } | 
 | 601 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 602 | void CPDFSDK_InteractiveForm::AfterSelectionChange(CPDF_FormField* pField) { | 
| Ryan Harrison | 9baf31f | 2018-01-12 18:36:30 +0000 | [diff] [blame] | 603 |   if (pField->GetFieldType() != FormFieldType::kListBox) | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 604 |     return; | 
 | 605 |  | 
 | 606 |   OnCalculate(pField); | 
| Lei Zhang | 4f261ff | 2018-10-10 18:44:45 +0000 | [diff] [blame] | 607 |   ResetFieldAppearance(pField, pdfium::nullopt, true); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 608 |   UpdateField(pField); | 
 | 609 | } | 
 | 610 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 611 | void CPDFSDK_InteractiveForm::AfterCheckedStatusChange(CPDF_FormField* pField) { | 
| Ryan Harrison | 9baf31f | 2018-01-12 18:36:30 +0000 | [diff] [blame] | 612 |   FormFieldType fieldType = pField->GetFieldType(); | 
 | 613 |   if (fieldType != FormFieldType::kCheckBox && | 
 | 614 |       fieldType != FormFieldType::kRadioButton) | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 615 |     return; | 
 | 616 |  | 
 | 617 |   OnCalculate(pField); | 
 | 618 |   UpdateField(pField); | 
 | 619 | } | 
 | 620 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 621 | void CPDFSDK_InteractiveForm::AfterFormReset(CPDF_InteractiveForm* pForm) { | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 622 |   OnCalculate(nullptr); | 
 | 623 | } | 
 | 624 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 625 | bool CPDFSDK_InteractiveForm::IsNeedHighLight(FormFieldType fieldType) const { | 
| Ryan Harrison | 9baf31f | 2018-01-12 18:36:30 +0000 | [diff] [blame] | 626 |   if (fieldType == FormFieldType::kUnknown) | 
| tsepez | 4cf5515 | 2016-11-02 14:37:54 -0700 | [diff] [blame] | 627 |     return false; | 
| Ryan Harrison | 9baf31f | 2018-01-12 18:36:30 +0000 | [diff] [blame] | 628 |  | 
| Ryan Harrison | 2056fac | 2018-01-16 16:06:45 +0000 | [diff] [blame] | 629 | #ifdef PDF_ENABLE_XFA | 
 | 630 |   // For the XFA fields, we need to return if the specific field type has | 
 | 631 |   // highlight enabled or if the general XFA field type has it enabled. | 
 | 632 |   if (IsFormFieldTypeXFA(fieldType)) { | 
 | 633 |     if (!m_NeedsHighlight[static_cast<size_t>(fieldType)]) | 
 | 634 |       return m_NeedsHighlight[static_cast<size_t>(FormFieldType::kXFA)]; | 
 | 635 |   } | 
 | 636 | #endif  // PDF_ENABLE_XFA | 
| Ryan Harrison | 9baf31f | 2018-01-12 18:36:30 +0000 | [diff] [blame] | 637 |   return m_NeedsHighlight[static_cast<size_t>(fieldType)]; | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 638 | } | 
 | 639 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 640 | void CPDFSDK_InteractiveForm::RemoveAllHighLights() { | 
| Ryan Harrison | 9baf31f | 2018-01-12 18:36:30 +0000 | [diff] [blame] | 641 |   std::fill(m_HighlightColor, m_HighlightColor + kFormFieldTypeCount, | 
| Lei Zhang | 4f7479a | 2018-03-21 13:37:06 +0000 | [diff] [blame] | 642 |             kWhiteBGR); | 
| Ryan Harrison | 9baf31f | 2018-01-12 18:36:30 +0000 | [diff] [blame] | 643 |   std::fill(m_NeedsHighlight, m_NeedsHighlight + kFormFieldTypeCount, false); | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 644 | } | 
 | 645 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 646 | void CPDFSDK_InteractiveForm::SetHighlightColor(FX_COLORREF clr, | 
 | 647 |                                                 FormFieldType fieldType) { | 
| Ryan Harrison | 9baf31f | 2018-01-12 18:36:30 +0000 | [diff] [blame] | 648 |   if (fieldType == FormFieldType::kUnknown) | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 649 |     return; | 
| Ryan Harrison | 9baf31f | 2018-01-12 18:36:30 +0000 | [diff] [blame] | 650 |  | 
 | 651 |   m_HighlightColor[static_cast<size_t>(fieldType)] = clr; | 
 | 652 |   m_NeedsHighlight[static_cast<size_t>(fieldType)] = true; | 
 | 653 | } | 
 | 654 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 655 | void CPDFSDK_InteractiveForm::SetAllHighlightColors(FX_COLORREF clr) { | 
| Ryan Harrison | 9baf31f | 2018-01-12 18:36:30 +0000 | [diff] [blame] | 656 |   for (auto type : kFormFieldTypes) { | 
 | 657 |     m_HighlightColor[static_cast<size_t>(type)] = clr; | 
 | 658 |     m_NeedsHighlight[static_cast<size_t>(type)] = true; | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 659 |   } | 
 | 660 | } | 
 | 661 |  | 
| Lei Zhang | 073ecf4 | 2018-10-11 16:56:00 +0000 | [diff] [blame] | 662 | FX_COLORREF CPDFSDK_InteractiveForm::GetHighlightColor( | 
 | 663 |     FormFieldType fieldType) { | 
| Ryan Harrison | 9baf31f | 2018-01-12 18:36:30 +0000 | [diff] [blame] | 664 |   if (fieldType == FormFieldType::kUnknown) | 
| Lei Zhang | 4f7479a | 2018-03-21 13:37:06 +0000 | [diff] [blame] | 665 |     return kWhiteBGR; | 
| Ryan Harrison | 9baf31f | 2018-01-12 18:36:30 +0000 | [diff] [blame] | 666 |  | 
| Ryan Harrison | 2056fac | 2018-01-16 16:06:45 +0000 | [diff] [blame] | 667 | #ifdef PDF_ENABLE_XFA | 
 | 668 |   // For the XFA fields, we need to return the specific field type highlight | 
 | 669 |   // colour or the general XFA field type colour if present. | 
 | 670 |   if (IsFormFieldTypeXFA(fieldType)) { | 
 | 671 |     if (!m_NeedsHighlight[static_cast<size_t>(fieldType)] && | 
 | 672 |         m_NeedsHighlight[static_cast<size_t>(FormFieldType::kXFA)]) { | 
 | 673 |       return m_HighlightColor[static_cast<size_t>(FormFieldType::kXFA)]; | 
 | 674 |     } | 
 | 675 |   } | 
 | 676 | #endif  // PDF_ENABLE_XFA | 
| Ryan Harrison | 9baf31f | 2018-01-12 18:36:30 +0000 | [diff] [blame] | 677 |   return m_HighlightColor[static_cast<size_t>(fieldType)]; | 
| jaepark | 611adb8 | 2016-08-17 11:34:36 -0700 | [diff] [blame] | 678 | } |