blob: e4a6ecb08ea691cf98ab2af19361deb4a71fc489 [file] [log] [blame]
K. Moon832a6942022-10-31 20:11:31 +00001// Copyright 2014 The PDFium Authors
Dan Sinclair1770c022016-03-14 14:14:16 -04002// 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
Dan Sinclair80c48782017-03-23 12:11:20 -04007#ifndef XFA_FXFA_CXFA_FFDOCVIEW_H_
8#define XFA_FXFA_CXFA_FFDOCVIEW_H_
Dan Sinclair1770c022016-03-14 14:14:16 -04009
Tom Sepez7b53f862020-09-01 23:13:22 +000010#include <list>
tsepez51709be2016-12-08 10:55:57 -080011#include <vector>
tsepezd77f4172016-05-19 17:14:41 -070012
Tom Sepezf372c792024-05-14 04:47:50 +000013#include "core/fxcrt/span.h"
Tom Sepez017cbc62020-08-18 23:25:17 +000014#include "fxjs/gc/heap.h"
15#include "v8/include/cppgc/garbage-collected.h"
16#include "v8/include/cppgc/member.h"
17#include "v8/include/cppgc/visitor.h"
dsinclair5b493092016-09-29 20:20:24 -070018#include "xfa/fxfa/cxfa_eventparam.h"
Dan Sinclair80c48782017-03-23 12:11:20 -040019#include "xfa/fxfa/cxfa_ffdoc.h"
Tom Sepez931dd1b2019-08-15 18:36:39 +000020#include "xfa/fxfa/cxfa_ffwidget.h"
Tom Sepez60e4bc22019-07-02 16:14:51 +000021#include "xfa/fxfa/fxfa.h"
Dan Sinclair1770c022016-03-14 14:14:16 -040022
Dan Sinclair368c6342018-01-03 15:22:37 -050023class CXFA_BindItems;
Dan Sinclair1770c022016-03-14 14:14:16 -040024class CXFA_FFDoc;
Tom Sepez685d24f2019-04-09 21:11:56 +000025class CXFA_FFWidgetHandler;
Dan Sinclair8a0941d2018-01-23 16:52:14 +000026class CXFA_Node;
Tom Sepez56637652022-06-08 17:38:00 +000027class CXFA_Subform;
Tom Sepez685d24f2019-04-09 21:11:56 +000028class CXFA_ViewLayoutItem;
dsinclairdf4bc592016-03-31 20:34:43 -070029
Tom Sepezf372c792024-05-14 04:47:50 +000030extern const pdfium::span<const XFA_AttributeValue> kXFAEventActivity;
Tom Sepezfdbfb3c2021-08-02 22:59:52 +000031
Tom Sepez017cbc62020-08-18 23:25:17 +000032class CXFA_FFDocView : public cppgc::GarbageCollected<CXFA_FFDocView> {
Dan Sinclair1770c022016-03-14 14:14:16 -040033 public:
Tom Sepezd33f1fe2021-08-20 00:19:14 +000034 enum class LayoutStatus : uint8_t { kNone, kStart, kDoing, kEnd };
35
Tom Sepez2f20b192021-08-20 15:40:55 +000036 class UpdateScope {
Tom Sepeza66463a2022-01-28 00:34:03 +000037 CPPGC_STACK_ALLOCATED();
38
Tom Sepez2f20b192021-08-20 15:40:55 +000039 public:
40 explicit UpdateScope(CXFA_FFDocView* pDocView);
41 ~UpdateScope();
42
43 private:
44 UnownedPtr<CXFA_FFDocView> const m_pDocView;
45 };
46
Tom Sepez017cbc62020-08-18 23:25:17 +000047 CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED;
Dan Sinclair1770c022016-03-14 14:14:16 -040048 ~CXFA_FFDocView();
49
Tom Sepez017cbc62020-08-18 23:25:17 +000050 void Trace(cppgc::Visitor* visitor) const;
51
Tom Sepez44528e42022-10-18 00:30:21 +000052 CXFA_FFDoc* GetDoc() const { return m_pDoc; }
Dan Sinclair66b9fa02018-01-23 16:49:34 +000053 int32_t StartLayout();
Dan Sinclairdf673c22017-05-04 12:09:52 -040054 int32_t DoLayout();
dsinclairdf4bc592016-03-31 20:34:43 -070055 void StopLayout();
Tom Sepez1ed29b82021-08-20 00:35:54 +000056
57 void SetLayoutEvent() { m_bLayoutEvent = true; }
58 bool InLayoutStatus() const { return m_bInLayoutStatus; }
Tom Sepezd33f1fe2021-08-20 00:19:14 +000059 LayoutStatus GetLayoutStatus() const { return m_iStatus; }
Tom Sepezc36ecfc2019-12-14 00:45:04 +000060
dsinclairdf4bc592016-03-31 20:34:43 -070061 void UpdateDocView();
Tom Sepezc36ecfc2019-12-14 00:45:04 +000062 void UpdateUIDisplay(CXFA_Node* pNode, CXFA_FFWidget* pExcept);
63
Lei Zhanga1739002017-06-29 21:33:34 -070064 int32_t CountPageViews() const;
65 CXFA_FFPageView* GetPageView(int32_t nIndex) const;
dsinclairdf4bc592016-03-31 20:34:43 -070066
Dan Sinclairbc948ce2018-01-22 21:28:58 +000067 void ResetNode(CXFA_Node* pNode);
Tom Sepeza1abe7b2020-08-29 00:33:07 +000068 CXFA_Node* GetRootSubform();
dsinclairdf4bc592016-03-31 20:34:43 -070069 CXFA_FFWidgetHandler* GetWidgetHandler();
Tom Sepez78d60bc2020-09-09 16:43:59 +000070 CXFA_FFWidget* GetFocusWidget() const { return m_pFocusWidget; }
Henrique Nakashima6f26db42018-04-09 17:18:24 +000071 bool SetFocus(CXFA_FFWidget* pNewFocus);
Dan Sinclair4a1de722018-01-04 13:40:07 -050072 CXFA_FFWidget* GetWidgetForNode(CXFA_Node* node);
Ryan Harrison275e2602017-09-18 14:23:18 -040073 CXFA_FFWidget* GetWidgetByName(const WideString& wsName,
weilib4d1b572016-08-10 14:50:48 -070074 CXFA_FFWidget* pRefWidget);
Tom Sepez936ca6b2020-07-29 23:03:51 +000075 CXFA_LayoutProcessor* GetLayoutProcessor() const;
Tom Sepezccf220d2021-05-20 20:08:25 +000076 void OnPageViewEvent(CXFA_ViewLayoutItem* pSender,
Tom Sepezdc3718f2021-06-09 01:01:29 +000077 CXFA_FFDoc::PageViewEvent eEvent);
Dan Sinclair68708e42017-10-18 13:20:59 -040078 void LockUpdate() { m_iLock++; }
79 void UnlockUpdate() { m_iLock--; }
Henrique Nakashimadc566b02018-04-04 16:38:40 +000080 void InvalidateRect(CXFA_FFPageView* pPageView,
81 const CFX_RectF& rtInvalidate);
Dan Sinclair1770c022016-03-14 14:14:16 -040082 void RunDocClose();
Dan Sinclair1770c022016-03-14 14:14:16 -040083
Dan Sinclair8a0941d2018-01-23 16:52:14 +000084 void ProcessValueChanged(CXFA_Node* node);
Dan Sinclair1770c022016-03-14 14:14:16 -040085 void SetChangeMark();
86
Dan Sinclair8a0941d2018-01-23 16:52:14 +000087 void AddValidateNode(CXFA_Node* node);
Dan Sinclair1770c022016-03-14 14:14:16 -040088 void AddCalculateNodeNotify(CXFA_Node* pNodeChange);
Dan Sinclair8a0941d2018-01-23 16:52:14 +000089 void AddCalculateNode(CXFA_Node* node);
Dan Sinclair66b9fa02018-01-23 16:49:34 +000090
tsepezd19e9122016-11-02 15:43:18 -070091 bool RunLayout();
Dan Sinclair1770c022016-03-14 14:14:16 -040092 void AddNewFormNode(CXFA_Node* pNode);
Tom Sepez56637652022-06-08 17:38:00 +000093 void AddIndexChangedSubform(CXFA_Subform* pNode);
Tom Sepez78d60bc2020-09-09 16:43:59 +000094 CXFA_Node* GetFocusNode() const { return m_pFocusNode; }
Dan Sinclair8a0941d2018-01-23 16:52:14 +000095 void SetFocusNode(CXFA_Node* pNode);
Dan Sinclair1770c022016-03-14 14:14:16 -040096 void DeleteLayoutItem(CXFA_FFWidget* pWidget);
Tom Sepez60e4bc22019-07-02 16:14:51 +000097 XFA_EventError ExecEventActivityByDeepFirst(CXFA_Node* pFormNode,
98 XFA_EVENTTYPE eEventType,
99 bool bIsFormReady,
100 bool bRecursive);
Dan Sinclair368c6342018-01-03 15:22:37 -0500101
102 void AddBindItem(CXFA_BindItems* item) { m_BindItems.push_back(item); }
Tom Sepez1ed29b82021-08-20 00:35:54 +0000103 void AddNullTestMsg(const WideString& msg);
Dan Sinclair1770c022016-03-14 14:14:16 -0400104
Dan Sinclair80c48782017-03-23 12:11:20 -0400105 private:
Tom Sepez017cbc62020-08-18 23:25:17 +0000106 explicit CXFA_FFDocView(CXFA_FFDoc* pDoc);
107
tsepezd19e9122016-11-02 15:43:18 -0700108 bool RunEventLayoutReady();
Dan Sinclair1770c022016-03-14 14:14:16 -0400109 void RunBindItems();
Dan Sinclair68708e42017-10-18 13:20:59 -0400110 void InitCalculate(CXFA_Node* pNode);
Dan Sinclair1770c022016-03-14 14:14:16 -0400111 void InitLayout(CXFA_Node* pNode);
Lei Zhanga1739002017-06-29 21:33:34 -0700112 size_t RunCalculateRecursive(size_t index);
Dan Sinclair1770c022016-03-14 14:14:16 -0400113 void ShowNullTestMsg();
Dan Sinclairbc948ce2018-01-22 21:28:58 +0000114 bool ResetSingleNodeData(CXFA_Node* pNode);
Dan Sinclair1770c022016-03-14 14:14:16 -0400115
Lei Zhang490dc8a2020-01-21 20:52:41 +0000116 bool IsUpdateLocked() const { return m_iLock > 0; }
Dan Sinclair66b9fa02018-01-23 16:49:34 +0000117 bool InitValidate(CXFA_Node* pNode);
118 bool RunValidate();
Tom Sepez60e4bc22019-07-02 16:14:51 +0000119 XFA_EventError RunCalculateWidgets();
Dan Sinclair66b9fa02018-01-23 16:49:34 +0000120 void RunSubformIndexChange();
121
Tom Sepez017cbc62020-08-18 23:25:17 +0000122 cppgc::Member<CXFA_FFDoc> const m_pDoc;
123 cppgc::Member<CXFA_FFWidgetHandler> m_pWidgetHandler;
124 cppgc::Member<CXFA_Node> m_pFocusNode;
Tom Sepez78d60bc2020-09-09 16:43:59 +0000125 cppgc::Member<CXFA_FFWidget> m_pFocusWidget;
Tom Sepez7b53f862020-09-01 23:13:22 +0000126 std::list<cppgc::Member<CXFA_Node>> m_ValidateNodes;
Tom Sepez017cbc62020-08-18 23:25:17 +0000127 std::vector<cppgc::Member<CXFA_Node>> m_CalculateNodes;
Tom Sepez7b53f862020-09-01 23:13:22 +0000128 std::list<cppgc::Member<CXFA_BindItems>> m_BindItems;
129 std::list<cppgc::Member<CXFA_Node>> m_NewAddedNodes;
Tom Sepez56637652022-06-08 17:38:00 +0000130 std::list<cppgc::Member<CXFA_Subform>> m_IndexChangedSubforms;
Tom Sepez1ed29b82021-08-20 00:35:54 +0000131 std::vector<WideString> m_NullTestMsgArray;
132 bool m_bLayoutEvent = false;
133 bool m_bInLayoutStatus = false;
Tom Sepezd33f1fe2021-08-20 00:19:14 +0000134 LayoutStatus m_iStatus = LayoutStatus::kNone;
Dan Sinclair66b9fa02018-01-23 16:49:34 +0000135 int32_t m_iLock = 0;
Dan Sinclair1770c022016-03-14 14:14:16 -0400136};
tsepezcc4d6d82016-05-16 13:21:03 -0700137
Dan Sinclair80c48782017-03-23 12:11:20 -0400138#endif // XFA_FXFA_CXFA_FFDOCVIEW_H_