14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2016 PDFium Authors. All rights reserved.
24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be
34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file.
44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "fpdfsdk/cpdfsdk_interform.h"
84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <algorithm>
104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <memory>
114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <vector>
124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/page/cpdf_page.h"
144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cfdf_document.h"
154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_array.h"
164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_document.h"
174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_stream.h"
184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfdoc/cpdf_actionfields.h"
194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfdoc/cpdf_interform.h"
204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/cfx_graphstatedata.h"
214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/cfx_pathdata.h"
224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/cfx_renderdevice.h"
234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "fpdfsdk/cba_annotiterator.h"
244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "fpdfsdk/cpdfsdk_annot.h"
254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "fpdfsdk/cpdfsdk_formfillenvironment.h"
264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "fpdfsdk/cpdfsdk_pageview.h"
274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "fpdfsdk/cpdfsdk_widget.h"
284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "fpdfsdk/formfiller/cffl_formfiller.h"
294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "fpdfsdk/fsdk_actionhandler.h"
304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "fpdfsdk/fsdk_define.h"
314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "fpdfsdk/fxedit/fxet_edit.h"
324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "fpdfsdk/ipdfsdk_annothandler.h"
335ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann#include "fpdfsdk/javascript/ijs_event_context.h"
344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "fpdfsdk/javascript/ijs_runtime.h"
354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "fpdfsdk/pdfwindow/PWL_Utils.h"
364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "third_party/base/stl_util.h"
374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PDF_ENABLE_XFA
394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "fpdfsdk/cpdfsdk_xfawidget.h"
404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "fpdfsdk/fpdfxfa/cpdfxfa_context.h"
414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "fpdfsdk/fpdfxfa/cxfa_fwladaptertimermgr.h"
424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/cxfa_eventparam.h"
434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/xfa_ffdocview.h"
444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/xfa_ffwidget.h"
454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/xfa_ffwidgethandler.h"
464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif  // PDF_ENABLE_XFA
474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDFSDK_InterForm::CPDFSDK_InterForm(CPDFSDK_FormFillEnvironment* pFormFillEnv)
494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    : m_pFormFillEnv(pFormFillEnv),
504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pInterForm(new CPDF_InterForm(m_pFormFillEnv->GetPDFDocument())),
514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PDF_ENABLE_XFA
524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_bXfaCalculate(true),
534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_bXfaValidationsEnabled(true),
544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif  // PDF_ENABLE_XFA
554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_bCalculate(true),
564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_bBusy(false),
574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_iHighlightAlpha(0) {
584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pInterForm->SetFormNotify(this);
594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (int i = 0; i < kNumFieldTypes; ++i)
604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_bNeedHightlight[i] = false;
614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDFSDK_InterForm::~CPDFSDK_InterForm() {
644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_Map.clear();
654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PDF_ENABLE_XFA
664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_XFAMap.clear();
674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif  // PDF_ENABLE_XFA
684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPDFSDK_InterForm::HighlightWidgets() {
714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return false;
724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDFSDK_Widget* CPDFSDK_InterForm::GetSibling(CPDFSDK_Widget* pWidget,
754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                              bool bNext) const {
764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::unique_ptr<CBA_AnnotIterator> pIterator(new CBA_AnnotIterator(
774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pWidget->GetPageView(), CPDF_Annot::Subtype::WIDGET));
784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bNext)
804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return static_cast<CPDFSDK_Widget*>(pIterator->GetNextAnnot(pWidget));
814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return static_cast<CPDFSDK_Widget*>(pIterator->GetPrevAnnot(pWidget));
834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDFSDK_Widget* CPDFSDK_InterForm::GetWidget(CPDF_FormControl* pControl) const {
864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pControl || !m_pInterForm)
874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDFSDK_Widget* pWidget = nullptr;
904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const auto it = m_Map.find(pControl);
914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (it != m_Map.end())
924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pWidget = it->second;
934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pWidget)
944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return pWidget;
954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Dictionary* pControlDict = pControl->GetWidget();
974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Document* pDocument = m_pFormFillEnv->GetPDFDocument();
984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDFSDK_PageView* pPage = nullptr;
994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (CPDF_Dictionary* pPageDict = pControlDict->GetDictFor("P")) {
1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int nPageIndex = pDocument->GetPageIndex(pPageDict->GetObjNum());
1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (nPageIndex >= 0)
1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pPage = m_pFormFillEnv->GetPageView(nPageIndex);
1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pPage) {
1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int nPageIndex = GetPageIndexByAnnotDict(pDocument, pControlDict);
1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (nPageIndex >= 0)
1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pPage = m_pFormFillEnv->GetPageView(nPageIndex);
1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pPage)
1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return static_cast<CPDFSDK_Widget*>(pPage->GetAnnotByDict(pControlDict));
1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDFSDK_InterForm::GetWidgets(
1194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    const CFX_WideString& sFieldName,
1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    std::vector<CPDFSDK_Annot::ObservedPtr>* widgets) const {
1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (int i = 0, sz = m_pInterForm->CountFields(sFieldName); i < sz; ++i) {
1224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_FormField* pFormField = m_pInterForm->GetField(i, sFieldName);
1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    ASSERT(pFormField);
1244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    GetWidgets(pFormField, widgets);
1254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDFSDK_InterForm::GetWidgets(
1294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_FormField* pField,
1304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    std::vector<CPDFSDK_Annot::ObservedPtr>* widgets) const {
1314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (int i = 0, sz = pField->CountControls(); i < sz; ++i) {
1324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_FormControl* pFormCtrl = pField->GetControl(i);
1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    ASSERT(pFormCtrl);
1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDFSDK_Widget* pWidget = GetWidget(pFormCtrl);
1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (pWidget)
1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      widgets->emplace_back(pWidget);
1374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint CPDFSDK_InterForm::GetPageIndexByAnnotDict(
1414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_Document* pDocument,
1424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_Dictionary* pAnnotDict) const {
1434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ASSERT(pAnnotDict);
1444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (int i = 0, sz = pDocument->GetPageCount(); i < sz; i++) {
1464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (CPDF_Dictionary* pPageDict = pDocument->GetPage(i)) {
1474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (CPDF_Array* pAnnots = pPageDict->GetArrayFor("Annots")) {
1484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        for (int j = 0, jsz = pAnnots->GetCount(); j < jsz; j++) {
1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          CPDF_Object* pDict = pAnnots->GetDirectObjectAt(j);
1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          if (pAnnotDict == pDict)
1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            return i;
1524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
1534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
1544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
1554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return -1;
1584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDFSDK_InterForm::AddMap(CPDF_FormControl* pControl,
1614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                               CPDFSDK_Widget* pWidget) {
1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_Map[pControl] = pWidget;
1634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDFSDK_InterForm::RemoveMap(CPDF_FormControl* pControl) {
1664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_Map.erase(pControl);
1674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDFSDK_InterForm::EnableCalculate(bool bEnabled) {
1704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_bCalculate = bEnabled;
1714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPDFSDK_InterForm::IsCalculateEnabled() const {
1744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_bCalculate;
1754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PDF_ENABLE_XFA
1784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDFSDK_InterForm::AddXFAMap(CXFA_FFWidget* hWidget,
1794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                  CPDFSDK_XFAWidget* pWidget) {
1804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ASSERT(hWidget);
1814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_XFAMap[hWidget] = pWidget;
1824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDFSDK_InterForm::RemoveXFAMap(CXFA_FFWidget* hWidget) {
1854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ASSERT(hWidget);
1864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_XFAMap.erase(hWidget);
1874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDFSDK_XFAWidget* CPDFSDK_InterForm::GetXFAWidget(CXFA_FFWidget* hWidget) {
1904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ASSERT(hWidget);
1914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto it = m_XFAMap.find(hWidget);
1924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return it != m_XFAMap.end() ? it->second : nullptr;
1934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDFSDK_InterForm::XfaEnableCalculate(bool bEnabled) {
1964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_bXfaCalculate = bEnabled;
1974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPDFSDK_InterForm::IsXfaCalculateEnabled() const {
1994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_bXfaCalculate;
2004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPDFSDK_InterForm::IsXfaValidationsEnabled() {
2034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_bXfaValidationsEnabled;
2044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDFSDK_InterForm::XfaSetValidationsEnabled(bool bEnabled) {
2064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_bXfaValidationsEnabled = bEnabled;
2074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDFSDK_InterForm::SynchronizeField(CPDF_FormField* pFormField,
2104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                         bool bSynchronizeElse) {
2114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) {
2124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_FormControl* pFormCtrl = pFormField->GetControl(i);
2134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (CPDFSDK_Widget* pWidget = GetWidget(pFormCtrl))
2144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pWidget->Synchronize(bSynchronizeElse);
2154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif  // PDF_ENABLE_XFA
2184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDFSDK_InterForm::OnCalculate(CPDF_FormField* pFormField) {
2204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_pFormFillEnv->IsJSInitiated())
2214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
2224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_bBusy)
2244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
2254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_bBusy = true;
2274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!IsCalculateEnabled()) {
2294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_bBusy = false;
2304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
2314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  IJS_Runtime* pRuntime = m_pFormFillEnv->GetJSRuntime();
2344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int nSize = m_pInterForm->CountFieldsInCalculationOrder();
2354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (int i = 0; i < nSize; i++) {
2364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_FormField* pField = m_pInterForm->GetFieldInCalculationOrder(i);
2374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!pField)
2384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      continue;
2394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int nType = pField->GetFieldType();
2414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (nType != FIELDTYPE_COMBOBOX && nType != FIELDTYPE_TEXTFIELD)
2424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      continue;
2434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_AAction aAction = pField->GetAdditionalAction();
2454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!aAction.GetDict() || !aAction.ActionExist(CPDF_AAction::Calculate))
2464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      continue;
2474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_Action action = aAction.GetAction(CPDF_AAction::Calculate);
2494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!action.GetDict())
2504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      continue;
2514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFX_WideString csJS = action.GetJavaScript();
2534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (csJS.IsEmpty())
2544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      continue;
2554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2565ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann    IJS_EventContext* pContext = pRuntime->NewEventContext();
2574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFX_WideString sOldValue = pField->GetValue();
2584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFX_WideString sValue = sOldValue;
2594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    bool bRC = true;
2604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pContext->OnField_Calculate(pFormField, pField, sValue, bRC);
2614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFX_WideString sInfo;
2634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    bool bRet = pContext->RunScript(csJS, &sInfo);
2645ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann    pRuntime->ReleaseEventContext(pContext);
2654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (bRet && bRC && sValue.Compare(sOldValue) != 0)
2664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pField->SetValue(sValue, true);
2674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_bBusy = false;
2694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_WideString CPDFSDK_InterForm::OnFormat(CPDF_FormField* pFormField,
2724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                           bool& bFormatted) {
2734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_WideString sValue = pFormField->GetValue();
2744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_pFormFillEnv->IsJSInitiated()) {
2754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    bFormatted = false;
2764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return sValue;
2774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  IJS_Runtime* pRuntime = m_pFormFillEnv->GetJSRuntime();
2804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pFormField->GetFieldType() == FIELDTYPE_COMBOBOX &&
2814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pFormField->CountSelectedItems() > 0) {
2824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int index = pFormField->GetSelectedIndex(0);
2834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (index >= 0)
2844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      sValue = pFormField->GetOptionLabel(index);
2854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bFormatted = false;
2884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_AAction aAction = pFormField->GetAdditionalAction();
2904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (aAction.GetDict() && aAction.ActionExist(CPDF_AAction::Format)) {
2914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_Action action = aAction.GetAction(CPDF_AAction::Format);
2924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (action.GetDict()) {
2934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CFX_WideString script = action.GetJavaScript();
2944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (!script.IsEmpty()) {
2954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        CFX_WideString Value = sValue;
2964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2975ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann        IJS_EventContext* pContext = pRuntime->NewEventContext();
2984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        pContext->OnField_Format(pFormField, Value, true);
2994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        CFX_WideString sInfo;
3004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        bool bRet = pContext->RunScript(script, &sInfo);
3015ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann        pRuntime->ReleaseEventContext(pContext);
3024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (bRet) {
3034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          sValue = Value;
3044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          bFormatted = true;
3054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
3064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
3074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
3084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return sValue;
3104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDFSDK_InterForm::ResetFieldAppearance(CPDF_FormField* pFormField,
3134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                             const CFX_WideString* sValue,
3144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                             bool bValueChanged) {
3154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) {
3164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_FormControl* pFormCtrl = pFormField->GetControl(i);
3174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    ASSERT(pFormCtrl);
3184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (CPDFSDK_Widget* pWidget = GetWidget(pFormCtrl))
3194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pWidget->ResetAppearance(sValue, bValueChanged);
3204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDFSDK_InterForm::UpdateField(CPDF_FormField* pFormField) {
3245ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann  auto formfiller = m_pFormFillEnv->GetInteractiveFormFiller();
3254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) {
3264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_FormControl* pFormCtrl = pFormField->GetControl(i);
3274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    ASSERT(pFormCtrl);
3284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (CPDFSDK_Widget* pWidget = GetWidget(pFormCtrl)) {
3304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      UnderlyingPageType* pPage = pWidget->GetUnderlyingPage();
3315ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann      m_pFormFillEnv->Invalidate(
3325ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann          pPage, formfiller->GetViewBBox(
3335ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                     m_pFormFillEnv->GetPageView(pPage, false), pWidget));
3344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
3354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPDFSDK_InterForm::OnKeyStrokeCommit(CPDF_FormField* pFormField,
3394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                          const CFX_WideString& csValue) {
3404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_AAction aAction = pFormField->GetAdditionalAction();
3414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!aAction.GetDict() || !aAction.ActionExist(CPDF_AAction::KeyStroke))
3424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return true;
3434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Action action = aAction.GetAction(CPDF_AAction::KeyStroke);
3454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!action.GetDict())
3464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return true;
3474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDFSDK_ActionHandler* pActionHandler = m_pFormFillEnv->GetActionHander();
3494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  PDFSDK_FieldAction fa;
3504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  fa.bModifier = m_pFormFillEnv->IsCTRLKeyDown(0);
3514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  fa.bShift = m_pFormFillEnv->IsSHIFTKeyDown(0);
3524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  fa.sValue = csValue;
3534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pActionHandler->DoAction_FieldJavaScript(action, CPDF_AAction::KeyStroke,
3544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                           m_pFormFillEnv, pFormField, fa);
3554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return fa.bRC;
3564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPDFSDK_InterForm::OnValidate(CPDF_FormField* pFormField,
3594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                   const CFX_WideString& csValue) {
3604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_AAction aAction = pFormField->GetAdditionalAction();
3614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!aAction.GetDict() || !aAction.ActionExist(CPDF_AAction::Validate))
3624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return true;
3634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Action action = aAction.GetAction(CPDF_AAction::Validate);
3654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!action.GetDict())
3664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return true;
3674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDFSDK_ActionHandler* pActionHandler = m_pFormFillEnv->GetActionHander();
3694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  PDFSDK_FieldAction fa;
3704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  fa.bModifier = m_pFormFillEnv->IsCTRLKeyDown(0);
3714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  fa.bShift = m_pFormFillEnv->IsSHIFTKeyDown(0);
3724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  fa.sValue = csValue;
3734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pActionHandler->DoAction_FieldJavaScript(action, CPDF_AAction::Validate,
3744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                           m_pFormFillEnv, pFormField, fa);
3754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return fa.bRC;
3764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPDFSDK_InterForm::DoAction_Hide(const CPDF_Action& action) {
3794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ASSERT(action.GetDict());
3804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_ActionFields af(&action);
3824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::vector<CPDF_Object*> fieldObjects = af.GetAllFields();
3834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::vector<CPDF_FormField*> fields = GetFieldFromObjects(fieldObjects);
3844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool bHide = action.GetHideStatus();
3864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool bChanged = false;
3874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (CPDF_FormField* pField : fields) {
3894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    for (int i = 0, sz = pField->CountControls(); i < sz; ++i) {
3904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CPDF_FormControl* pControl = pField->GetControl(i);
3914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      ASSERT(pControl);
3924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (CPDFSDK_Widget* pWidget = GetWidget(pControl)) {
3944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        uint32_t nFlags = pWidget->GetFlags();
3954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        nFlags &= ~ANNOTFLAG_INVISIBLE;
3964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        nFlags &= ~ANNOTFLAG_NOVIEW;
3974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (bHide)
3984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          nFlags |= ANNOTFLAG_HIDDEN;
3994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        else
4004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          nFlags &= ~ANNOTFLAG_HIDDEN;
4014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        pWidget->SetFlags(nFlags);
4024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        pWidget->GetPageView()->UpdateView(pWidget);
4034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        bChanged = true;
4044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
4054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
4064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return bChanged;
4094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPDFSDK_InterForm::DoAction_SubmitForm(const CPDF_Action& action) {
4124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_WideString sDestination = action.GetFilePath();
4134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (sDestination.IsEmpty())
4144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
4154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Dictionary* pActionDict = action.GetDict();
4174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pActionDict->KeyExist("Fields")) {
4184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_ActionFields af(&action);
4194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    uint32_t dwFlags = action.GetFlags();
4204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    std::vector<CPDF_Object*> fieldObjects = af.GetAllFields();
4214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    std::vector<CPDF_FormField*> fields = GetFieldFromObjects(fieldObjects);
4224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!fields.empty()) {
4234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      bool bIncludeOrExclude = !(dwFlags & 0x01);
4245ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann      if (!m_pInterForm->CheckRequiredFields(&fields, bIncludeOrExclude))
4254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return false;
4264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return SubmitFields(sDestination, fields, bIncludeOrExclude, false);
4284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
4294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4305ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann  if (!m_pInterForm->CheckRequiredFields(nullptr, true))
4314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
4324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return SubmitForm(sDestination, false);
4344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPDFSDK_InterForm::SubmitFields(const CFX_WideString& csDestination,
4374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                     const std::vector<CPDF_FormField*>& fields,
4384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                     bool bIncludeOrExclude,
4394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                     bool bUrlEncoded) {
4404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteTextBuf textBuf;
4414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ExportFieldsToFDFTextBuf(fields, bIncludeOrExclude, textBuf);
4424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint8_t* pBuffer = textBuf.GetBuffer();
4444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_STRSIZE nBufSize = textBuf.GetLength();
4454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bUrlEncoded && !FDFToURLEncodedData(pBuffer, nBufSize))
4474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
4484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pFormFillEnv->JS_docSubmitForm(pBuffer, nBufSize, csDestination.c_str());
4504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
4514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPDFSDK_InterForm::FDFToURLEncodedData(CFX_WideString csFDFFile,
4544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                            CFX_WideString csTxtFile) {
4554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
4564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPDFSDK_InterForm::FDFToURLEncodedData(uint8_t*& pBuf,
4594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                            FX_STRSIZE& nBufSize) {
4604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::unique_ptr<CFDF_Document> pFDF =
4614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CFDF_Document::ParseMemory(pBuf, nBufSize);
4624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pFDF)
4634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return true;
4644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Dictionary* pMainDict = pFDF->GetRoot()->GetDictFor("FDF");
4664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pMainDict)
4674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
4684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Array* pFields = pMainDict->GetArrayFor("Fields");
4704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pFields)
4714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
4724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteTextBuf fdfEncodedData;
4744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (uint32_t i = 0; i < pFields->GetCount(); i++) {
4754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_Dictionary* pField = pFields->GetDictAt(i);
4764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!pField)
4774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      continue;
4784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFX_WideString name;
4794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    name = pField->GetUnicodeTextFor("T");
4804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFX_ByteString name_b = CFX_ByteString::FromUnicode(name);
4814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFX_ByteString csBValue = pField->GetStringFor("V");
4824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFX_WideString csWValue = PDF_DecodeText(csBValue);
4834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFX_ByteString csValue_b = CFX_ByteString::FromUnicode(csWValue);
4844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    fdfEncodedData << name_b.GetBuffer(name_b.GetLength());
4864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    name_b.ReleaseBuffer();
4874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    fdfEncodedData << "=";
4884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    fdfEncodedData << csValue_b.GetBuffer(csValue_b.GetLength());
4894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    csValue_b.ReleaseBuffer();
4904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (i != pFields->GetCount() - 1)
4914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      fdfEncodedData << "&";
4924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  nBufSize = fdfEncodedData.GetLength();
4954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pBuf = FX_Alloc(uint8_t, nBufSize);
4964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FXSYS_memcpy(pBuf, fdfEncodedData.GetBuffer(), nBufSize);
4974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
4984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPDFSDK_InterForm::ExportFieldsToFDFTextBuf(
5014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    const std::vector<CPDF_FormField*>& fields,
5024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    bool bIncludeOrExclude,
5034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFX_ByteTextBuf& textBuf) {
5044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::unique_ptr<CFDF_Document> pFDF =
5054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pInterForm->ExportToFDF(m_pFormFillEnv->JS_docGetFilePath().AsStringC(),
5064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                fields, bIncludeOrExclude, false);
5074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return pFDF ? pFDF->WriteBuf(textBuf) : false;
5084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_WideString CPDFSDK_InterForm::GetTemporaryFileName(
5114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    const CFX_WideString& sFileExt) {
5124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return L"";
5134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPDFSDK_InterForm::SubmitForm(const CFX_WideString& sDestination,
5164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                   bool bUrlEncoded) {
5174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (sDestination.IsEmpty())
5184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
5194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_pFormFillEnv || !m_pInterForm)
5214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
5224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::unique_ptr<CFDF_Document> pFDFDoc = m_pInterForm->ExportToFDF(
5244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pFormFillEnv->JS_docGetFilePath().AsStringC(), false);
5254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pFDFDoc)
5264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
5274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteTextBuf FdfBuffer;
5294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pFDFDoc->WriteBuf(FdfBuffer))
5304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
5314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint8_t* pBuffer = FdfBuffer.GetBuffer();
5334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_STRSIZE nBufSize = FdfBuffer.GetLength();
5344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bUrlEncoded && !FDFToURLEncodedData(pBuffer, nBufSize))
5354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
5364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pFormFillEnv->JS_docSubmitForm(pBuffer, nBufSize, sDestination.c_str());
5384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bUrlEncoded)
5394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    FX_Free(pBuffer);
5404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
5424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPDFSDK_InterForm::ExportFormToFDFTextBuf(CFX_ByteTextBuf& textBuf) {
5454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::unique_ptr<CFDF_Document> pFDF = m_pInterForm->ExportToFDF(
5464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pFormFillEnv->JS_docGetFilePath().AsStringC(), false);
5474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return pFDF && pFDF->WriteBuf(textBuf);
5484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPDFSDK_InterForm::DoAction_ResetForm(const CPDF_Action& action) {
5514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ASSERT(action.GetDict());
5524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Dictionary* pActionDict = action.GetDict();
5544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pActionDict->KeyExist("Fields"))
5554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return m_pInterForm->ResetForm(true);
5564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_ActionFields af(&action);
5584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint32_t dwFlags = action.GetFlags();
5594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::vector<CPDF_Object*> fieldObjects = af.GetAllFields();
5614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::vector<CPDF_FormField*> fields = GetFieldFromObjects(fieldObjects);
5624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_pInterForm->ResetForm(fields, !(dwFlags & 0x01), true);
5634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPDFSDK_InterForm::DoAction_ImportData(const CPDF_Action& action) {
5664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return false;
5674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannstd::vector<CPDF_FormField*> CPDFSDK_InterForm::GetFieldFromObjects(
5704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    const std::vector<CPDF_Object*>& objects) const {
5714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::vector<CPDF_FormField*> fields;
5724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (CPDF_Object* pObject : objects) {
5734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (pObject && pObject->IsString()) {
5744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CFX_WideString csName = pObject->GetUnicodeText();
5754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CPDF_FormField* pField = m_pInterForm->GetField(0, csName);
5764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (pField)
5774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        fields.push_back(pField);
5784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
5794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
5804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return fields;
5814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint CPDFSDK_InterForm::BeforeValueChange(CPDF_FormField* pField,
5844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                         const CFX_WideString& csValue) {
5854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int nType = pField->GetFieldType();
5864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (nType != FIELDTYPE_COMBOBOX && nType != FIELDTYPE_TEXTFIELD)
5874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return 0;
5884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!OnKeyStrokeCommit(pField, csValue))
5904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return -1;
5914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!OnValidate(pField, csValue))
5934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return -1;
5944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return 1;
5964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDFSDK_InterForm::AfterValueChange(CPDF_FormField* pField) {
5994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifdef PDF_ENABLE_XFA
6004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  SynchronizeField(pField, false);
6014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif  // PDF_ENABLE_XFA
6024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int nType = pField->GetFieldType();
6034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (nType == FIELDTYPE_COMBOBOX || nType == FIELDTYPE_TEXTFIELD) {
6044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    OnCalculate(pField);
6054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    bool bFormatted = false;
6064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFX_WideString sValue = OnFormat(pField, bFormatted);
6074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    ResetFieldAppearance(pField, bFormatted ? &sValue : nullptr, true);
6084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    UpdateField(pField);
6094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
6104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint CPDFSDK_InterForm::BeforeSelectionChange(CPDF_FormField* pField,
6134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                             const CFX_WideString& csValue) {
6144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pField->GetFieldType() != FIELDTYPE_LISTBOX)
6154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return 0;
6164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!OnKeyStrokeCommit(pField, csValue))
6184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return -1;
6194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!OnValidate(pField, csValue))
6214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return -1;
6224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return 1;
6244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDFSDK_InterForm::AfterSelectionChange(CPDF_FormField* pField) {
6274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pField->GetFieldType() != FIELDTYPE_LISTBOX)
6284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
6294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  OnCalculate(pField);
6314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ResetFieldAppearance(pField, nullptr, true);
6324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  UpdateField(pField);
6334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDFSDK_InterForm::AfterCheckedStatusChange(CPDF_FormField* pField) {
6364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int nType = pField->GetFieldType();
6374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (nType != FIELDTYPE_CHECKBOX && nType != FIELDTYPE_RADIOBUTTON)
6384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
6394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  OnCalculate(pField);
6414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  UpdateField(pField);
6424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint CPDFSDK_InterForm::BeforeFormReset(CPDF_InterForm* pForm) {
6454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return 0;
6464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDFSDK_InterForm::AfterFormReset(CPDF_InterForm* pForm) {
6494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  OnCalculate(nullptr);
6504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint CPDFSDK_InterForm::BeforeFormImportData(CPDF_InterForm* pForm) {
6534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return 0;
6544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDFSDK_InterForm::AfterFormImportData(CPDF_InterForm* pForm) {
6574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  OnCalculate(nullptr);
6584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPDFSDK_InterForm::IsNeedHighLight(int nFieldType) {
6614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (nFieldType < 1 || nFieldType > kNumFieldTypes)
6624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
6634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_bNeedHightlight[nFieldType - 1];
6644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDFSDK_InterForm::RemoveAllHighLight() {
6674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (int i = 0; i < kNumFieldTypes; ++i)
6684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_bNeedHightlight[i] = false;
6694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDFSDK_InterForm::SetHighlightColor(FX_COLORREF clr, int nFieldType) {
6724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (nFieldType < 0 || nFieldType > kNumFieldTypes)
6734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
6744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  switch (nFieldType) {
6754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case 0: {
6764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      for (int i = 0; i < kNumFieldTypes; ++i) {
6774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        m_aHighlightColor[i] = clr;
6784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        m_bNeedHightlight[i] = true;
6794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
6804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
6814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
6824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    default: {
6834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_aHighlightColor[nFieldType - 1] = clr;
6844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_bNeedHightlight[nFieldType - 1] = true;
6854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
6864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
6874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
6884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_COLORREF CPDFSDK_InterForm::GetHighlightColor(int nFieldType) {
6914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (nFieldType < 0 || nFieldType > kNumFieldTypes)
6924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return FXSYS_RGB(255, 255, 255);
6934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (nFieldType == 0)
6944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return m_aHighlightColor[0];
6954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_aHighlightColor[nFieldType - 1];
6964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
697