K. Moon | 832a694 | 2022-10-31 20:11:31 +0000 | [diff] [blame] | 1 | // Copyright 2014 The PDFium Authors |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 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 | |
Dan Sinclair | 80c4878 | 2017-03-23 12:11:20 -0400 | [diff] [blame] | 7 | #ifndef XFA_FXFA_CXFA_FFDOCVIEW_H_ |
| 8 | #define XFA_FXFA_CXFA_FFDOCVIEW_H_ |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 9 | |
Tom Sepez | 7b53f86 | 2020-09-01 23:13:22 +0000 | [diff] [blame] | 10 | #include <list> |
tsepez | 51709be | 2016-12-08 10:55:57 -0800 | [diff] [blame] | 11 | #include <vector> |
tsepez | d77f417 | 2016-05-19 17:14:41 -0700 | [diff] [blame] | 12 | |
Tom Sepez | f372c79 | 2024-05-14 04:47:50 +0000 | [diff] [blame] | 13 | #include "core/fxcrt/span.h" |
Tom Sepez | 017cbc6 | 2020-08-18 23:25:17 +0000 | [diff] [blame] | 14 | #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" |
dsinclair | 5b49309 | 2016-09-29 20:20:24 -0700 | [diff] [blame] | 18 | #include "xfa/fxfa/cxfa_eventparam.h" |
Dan Sinclair | 80c4878 | 2017-03-23 12:11:20 -0400 | [diff] [blame] | 19 | #include "xfa/fxfa/cxfa_ffdoc.h" |
Tom Sepez | 931dd1b | 2019-08-15 18:36:39 +0000 | [diff] [blame] | 20 | #include "xfa/fxfa/cxfa_ffwidget.h" |
Tom Sepez | 60e4bc2 | 2019-07-02 16:14:51 +0000 | [diff] [blame] | 21 | #include "xfa/fxfa/fxfa.h" |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 22 | |
Dan Sinclair | 368c634 | 2018-01-03 15:22:37 -0500 | [diff] [blame] | 23 | class CXFA_BindItems; |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 24 | class CXFA_FFDoc; |
Tom Sepez | 685d24f | 2019-04-09 21:11:56 +0000 | [diff] [blame] | 25 | class CXFA_FFWidgetHandler; |
Dan Sinclair | 8a0941d | 2018-01-23 16:52:14 +0000 | [diff] [blame] | 26 | class CXFA_Node; |
Tom Sepez | 5663765 | 2022-06-08 17:38:00 +0000 | [diff] [blame] | 27 | class CXFA_Subform; |
Tom Sepez | 685d24f | 2019-04-09 21:11:56 +0000 | [diff] [blame] | 28 | class CXFA_ViewLayoutItem; |
dsinclair | df4bc59 | 2016-03-31 20:34:43 -0700 | [diff] [blame] | 29 | |
Tom Sepez | f372c79 | 2024-05-14 04:47:50 +0000 | [diff] [blame] | 30 | extern const pdfium::span<const XFA_AttributeValue> kXFAEventActivity; |
Tom Sepez | fdbfb3c | 2021-08-02 22:59:52 +0000 | [diff] [blame] | 31 | |
Tom Sepez | 017cbc6 | 2020-08-18 23:25:17 +0000 | [diff] [blame] | 32 | class CXFA_FFDocView : public cppgc::GarbageCollected<CXFA_FFDocView> { |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 33 | public: |
Tom Sepez | d33f1fe | 2021-08-20 00:19:14 +0000 | [diff] [blame] | 34 | enum class LayoutStatus : uint8_t { kNone, kStart, kDoing, kEnd }; |
| 35 | |
Tom Sepez | 2f20b19 | 2021-08-20 15:40:55 +0000 | [diff] [blame] | 36 | class UpdateScope { |
Tom Sepez | a66463a | 2022-01-28 00:34:03 +0000 | [diff] [blame] | 37 | CPPGC_STACK_ALLOCATED(); |
| 38 | |
Tom Sepez | 2f20b19 | 2021-08-20 15:40:55 +0000 | [diff] [blame] | 39 | public: |
| 40 | explicit UpdateScope(CXFA_FFDocView* pDocView); |
| 41 | ~UpdateScope(); |
| 42 | |
| 43 | private: |
| 44 | UnownedPtr<CXFA_FFDocView> const m_pDocView; |
| 45 | }; |
| 46 | |
Tom Sepez | 017cbc6 | 2020-08-18 23:25:17 +0000 | [diff] [blame] | 47 | CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 48 | ~CXFA_FFDocView(); |
| 49 | |
Tom Sepez | 017cbc6 | 2020-08-18 23:25:17 +0000 | [diff] [blame] | 50 | void Trace(cppgc::Visitor* visitor) const; |
| 51 | |
Tom Sepez | 44528e4 | 2022-10-18 00:30:21 +0000 | [diff] [blame] | 52 | CXFA_FFDoc* GetDoc() const { return m_pDoc; } |
Dan Sinclair | 66b9fa0 | 2018-01-23 16:49:34 +0000 | [diff] [blame] | 53 | int32_t StartLayout(); |
Dan Sinclair | df673c2 | 2017-05-04 12:09:52 -0400 | [diff] [blame] | 54 | int32_t DoLayout(); |
dsinclair | df4bc59 | 2016-03-31 20:34:43 -0700 | [diff] [blame] | 55 | void StopLayout(); |
Tom Sepez | 1ed29b8 | 2021-08-20 00:35:54 +0000 | [diff] [blame] | 56 | |
| 57 | void SetLayoutEvent() { m_bLayoutEvent = true; } |
| 58 | bool InLayoutStatus() const { return m_bInLayoutStatus; } |
Tom Sepez | d33f1fe | 2021-08-20 00:19:14 +0000 | [diff] [blame] | 59 | LayoutStatus GetLayoutStatus() const { return m_iStatus; } |
Tom Sepez | c36ecfc | 2019-12-14 00:45:04 +0000 | [diff] [blame] | 60 | |
dsinclair | df4bc59 | 2016-03-31 20:34:43 -0700 | [diff] [blame] | 61 | void UpdateDocView(); |
Tom Sepez | c36ecfc | 2019-12-14 00:45:04 +0000 | [diff] [blame] | 62 | void UpdateUIDisplay(CXFA_Node* pNode, CXFA_FFWidget* pExcept); |
| 63 | |
Lei Zhang | a173900 | 2017-06-29 21:33:34 -0700 | [diff] [blame] | 64 | int32_t CountPageViews() const; |
| 65 | CXFA_FFPageView* GetPageView(int32_t nIndex) const; |
dsinclair | df4bc59 | 2016-03-31 20:34:43 -0700 | [diff] [blame] | 66 | |
Dan Sinclair | bc948ce | 2018-01-22 21:28:58 +0000 | [diff] [blame] | 67 | void ResetNode(CXFA_Node* pNode); |
Tom Sepez | a1abe7b | 2020-08-29 00:33:07 +0000 | [diff] [blame] | 68 | CXFA_Node* GetRootSubform(); |
dsinclair | df4bc59 | 2016-03-31 20:34:43 -0700 | [diff] [blame] | 69 | CXFA_FFWidgetHandler* GetWidgetHandler(); |
Tom Sepez | 78d60bc | 2020-09-09 16:43:59 +0000 | [diff] [blame] | 70 | CXFA_FFWidget* GetFocusWidget() const { return m_pFocusWidget; } |
Henrique Nakashima | 6f26db4 | 2018-04-09 17:18:24 +0000 | [diff] [blame] | 71 | bool SetFocus(CXFA_FFWidget* pNewFocus); |
Dan Sinclair | 4a1de72 | 2018-01-04 13:40:07 -0500 | [diff] [blame] | 72 | CXFA_FFWidget* GetWidgetForNode(CXFA_Node* node); |
Ryan Harrison | 275e260 | 2017-09-18 14:23:18 -0400 | [diff] [blame] | 73 | CXFA_FFWidget* GetWidgetByName(const WideString& wsName, |
weili | b4d1b57 | 2016-08-10 14:50:48 -0700 | [diff] [blame] | 74 | CXFA_FFWidget* pRefWidget); |
Tom Sepez | 936ca6b | 2020-07-29 23:03:51 +0000 | [diff] [blame] | 75 | CXFA_LayoutProcessor* GetLayoutProcessor() const; |
Tom Sepez | ccf220d | 2021-05-20 20:08:25 +0000 | [diff] [blame] | 76 | void OnPageViewEvent(CXFA_ViewLayoutItem* pSender, |
Tom Sepez | dc3718f | 2021-06-09 01:01:29 +0000 | [diff] [blame] | 77 | CXFA_FFDoc::PageViewEvent eEvent); |
Dan Sinclair | 68708e4 | 2017-10-18 13:20:59 -0400 | [diff] [blame] | 78 | void LockUpdate() { m_iLock++; } |
| 79 | void UnlockUpdate() { m_iLock--; } |
Henrique Nakashima | dc566b0 | 2018-04-04 16:38:40 +0000 | [diff] [blame] | 80 | void InvalidateRect(CXFA_FFPageView* pPageView, |
| 81 | const CFX_RectF& rtInvalidate); |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 82 | void RunDocClose(); |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 83 | |
Dan Sinclair | 8a0941d | 2018-01-23 16:52:14 +0000 | [diff] [blame] | 84 | void ProcessValueChanged(CXFA_Node* node); |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 85 | void SetChangeMark(); |
| 86 | |
Dan Sinclair | 8a0941d | 2018-01-23 16:52:14 +0000 | [diff] [blame] | 87 | void AddValidateNode(CXFA_Node* node); |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 88 | void AddCalculateNodeNotify(CXFA_Node* pNodeChange); |
Dan Sinclair | 8a0941d | 2018-01-23 16:52:14 +0000 | [diff] [blame] | 89 | void AddCalculateNode(CXFA_Node* node); |
Dan Sinclair | 66b9fa0 | 2018-01-23 16:49:34 +0000 | [diff] [blame] | 90 | |
tsepez | d19e912 | 2016-11-02 15:43:18 -0700 | [diff] [blame] | 91 | bool RunLayout(); |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 92 | void AddNewFormNode(CXFA_Node* pNode); |
Tom Sepez | 5663765 | 2022-06-08 17:38:00 +0000 | [diff] [blame] | 93 | void AddIndexChangedSubform(CXFA_Subform* pNode); |
Tom Sepez | 78d60bc | 2020-09-09 16:43:59 +0000 | [diff] [blame] | 94 | CXFA_Node* GetFocusNode() const { return m_pFocusNode; } |
Dan Sinclair | 8a0941d | 2018-01-23 16:52:14 +0000 | [diff] [blame] | 95 | void SetFocusNode(CXFA_Node* pNode); |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 96 | void DeleteLayoutItem(CXFA_FFWidget* pWidget); |
Tom Sepez | 60e4bc2 | 2019-07-02 16:14:51 +0000 | [diff] [blame] | 97 | XFA_EventError ExecEventActivityByDeepFirst(CXFA_Node* pFormNode, |
| 98 | XFA_EVENTTYPE eEventType, |
| 99 | bool bIsFormReady, |
| 100 | bool bRecursive); |
Dan Sinclair | 368c634 | 2018-01-03 15:22:37 -0500 | [diff] [blame] | 101 | |
| 102 | void AddBindItem(CXFA_BindItems* item) { m_BindItems.push_back(item); } |
Tom Sepez | 1ed29b8 | 2021-08-20 00:35:54 +0000 | [diff] [blame] | 103 | void AddNullTestMsg(const WideString& msg); |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 104 | |
Dan Sinclair | 80c4878 | 2017-03-23 12:11:20 -0400 | [diff] [blame] | 105 | private: |
Tom Sepez | 017cbc6 | 2020-08-18 23:25:17 +0000 | [diff] [blame] | 106 | explicit CXFA_FFDocView(CXFA_FFDoc* pDoc); |
| 107 | |
tsepez | d19e912 | 2016-11-02 15:43:18 -0700 | [diff] [blame] | 108 | bool RunEventLayoutReady(); |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 109 | void RunBindItems(); |
Dan Sinclair | 68708e4 | 2017-10-18 13:20:59 -0400 | [diff] [blame] | 110 | void InitCalculate(CXFA_Node* pNode); |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 111 | void InitLayout(CXFA_Node* pNode); |
Lei Zhang | a173900 | 2017-06-29 21:33:34 -0700 | [diff] [blame] | 112 | size_t RunCalculateRecursive(size_t index); |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 113 | void ShowNullTestMsg(); |
Dan Sinclair | bc948ce | 2018-01-22 21:28:58 +0000 | [diff] [blame] | 114 | bool ResetSingleNodeData(CXFA_Node* pNode); |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 115 | |
Lei Zhang | 490dc8a | 2020-01-21 20:52:41 +0000 | [diff] [blame] | 116 | bool IsUpdateLocked() const { return m_iLock > 0; } |
Dan Sinclair | 66b9fa0 | 2018-01-23 16:49:34 +0000 | [diff] [blame] | 117 | bool InitValidate(CXFA_Node* pNode); |
| 118 | bool RunValidate(); |
Tom Sepez | 60e4bc2 | 2019-07-02 16:14:51 +0000 | [diff] [blame] | 119 | XFA_EventError RunCalculateWidgets(); |
Dan Sinclair | 66b9fa0 | 2018-01-23 16:49:34 +0000 | [diff] [blame] | 120 | void RunSubformIndexChange(); |
| 121 | |
Tom Sepez | 017cbc6 | 2020-08-18 23:25:17 +0000 | [diff] [blame] | 122 | cppgc::Member<CXFA_FFDoc> const m_pDoc; |
| 123 | cppgc::Member<CXFA_FFWidgetHandler> m_pWidgetHandler; |
| 124 | cppgc::Member<CXFA_Node> m_pFocusNode; |
Tom Sepez | 78d60bc | 2020-09-09 16:43:59 +0000 | [diff] [blame] | 125 | cppgc::Member<CXFA_FFWidget> m_pFocusWidget; |
Tom Sepez | 7b53f86 | 2020-09-01 23:13:22 +0000 | [diff] [blame] | 126 | std::list<cppgc::Member<CXFA_Node>> m_ValidateNodes; |
Tom Sepez | 017cbc6 | 2020-08-18 23:25:17 +0000 | [diff] [blame] | 127 | std::vector<cppgc::Member<CXFA_Node>> m_CalculateNodes; |
Tom Sepez | 7b53f86 | 2020-09-01 23:13:22 +0000 | [diff] [blame] | 128 | std::list<cppgc::Member<CXFA_BindItems>> m_BindItems; |
| 129 | std::list<cppgc::Member<CXFA_Node>> m_NewAddedNodes; |
Tom Sepez | 5663765 | 2022-06-08 17:38:00 +0000 | [diff] [blame] | 130 | std::list<cppgc::Member<CXFA_Subform>> m_IndexChangedSubforms; |
Tom Sepez | 1ed29b8 | 2021-08-20 00:35:54 +0000 | [diff] [blame] | 131 | std::vector<WideString> m_NullTestMsgArray; |
| 132 | bool m_bLayoutEvent = false; |
| 133 | bool m_bInLayoutStatus = false; |
Tom Sepez | d33f1fe | 2021-08-20 00:19:14 +0000 | [diff] [blame] | 134 | LayoutStatus m_iStatus = LayoutStatus::kNone; |
Dan Sinclair | 66b9fa0 | 2018-01-23 16:49:34 +0000 | [diff] [blame] | 135 | int32_t m_iLock = 0; |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 136 | }; |
tsepez | cc4d6d8 | 2016-05-16 13:21:03 -0700 | [diff] [blame] | 137 | |
Dan Sinclair | 80c4878 | 2017-03-23 12:11:20 -0400 | [diff] [blame] | 138 | #endif // XFA_FXFA_CXFA_FFDOCVIEW_H_ |