1 // Copyright 2014 The PDFium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6 7 #ifndef XFA_FXFA_CXFA_FFDOCVIEW_H_ 8 #define XFA_FXFA_CXFA_FFDOCVIEW_H_ 9 10 #include <list> 11 #include <vector> 12 13 #include "core/fxcrt/span.h" 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" 18 #include "xfa/fxfa/cxfa_eventparam.h" 19 #include "xfa/fxfa/cxfa_ffdoc.h" 20 #include "xfa/fxfa/cxfa_ffwidget.h" 21 #include "xfa/fxfa/fxfa.h" 22 23 class CXFA_BindItems; 24 class CXFA_FFDoc; 25 class CXFA_FFWidgetHandler; 26 class CXFA_Node; 27 class CXFA_Subform; 28 class CXFA_ViewLayoutItem; 29 30 extern const pdfium::span<const XFA_AttributeValue> kXFAEventActivity; 31 32 class CXFA_FFDocView : public cppgc::GarbageCollected<CXFA_FFDocView> { 33 public: 34 enum class LayoutStatus : uint8_t { kNone, kStart, kDoing, kEnd }; 35 36 class UpdateScope { 37 CPPGC_STACK_ALLOCATED(); 38 39 public: 40 explicit UpdateScope(CXFA_FFDocView* pDocView); 41 ~UpdateScope(); 42 43 private: 44 UnownedPtr<CXFA_FFDocView> const m_pDocView; 45 }; 46 47 CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; 48 ~CXFA_FFDocView(); 49 50 void Trace(cppgc::Visitor* visitor) const; 51 GetDoc()52 CXFA_FFDoc* GetDoc() const { return m_pDoc; } 53 int32_t StartLayout(); 54 int32_t DoLayout(); 55 void StopLayout(); 56 SetLayoutEvent()57 void SetLayoutEvent() { m_bLayoutEvent = true; } InLayoutStatus()58 bool InLayoutStatus() const { return m_bInLayoutStatus; } GetLayoutStatus()59 LayoutStatus GetLayoutStatus() const { return m_iStatus; } 60 61 void UpdateDocView(); 62 void UpdateUIDisplay(CXFA_Node* pNode, CXFA_FFWidget* pExcept); 63 64 int32_t CountPageViews() const; 65 CXFA_FFPageView* GetPageView(int32_t nIndex) const; 66 67 void ResetNode(CXFA_Node* pNode); 68 CXFA_Node* GetRootSubform(); 69 CXFA_FFWidgetHandler* GetWidgetHandler(); GetFocusWidget()70 CXFA_FFWidget* GetFocusWidget() const { return m_pFocusWidget; } 71 bool SetFocus(CXFA_FFWidget* pNewFocus); 72 CXFA_FFWidget* GetWidgetForNode(CXFA_Node* node); 73 CXFA_FFWidget* GetWidgetByName(const WideString& wsName, 74 CXFA_FFWidget* pRefWidget); 75 CXFA_LayoutProcessor* GetLayoutProcessor() const; 76 void OnPageViewEvent(CXFA_ViewLayoutItem* pSender, 77 CXFA_FFDoc::PageViewEvent eEvent); LockUpdate()78 void LockUpdate() { m_iLock++; } UnlockUpdate()79 void UnlockUpdate() { m_iLock--; } 80 void InvalidateRect(CXFA_FFPageView* pPageView, 81 const CFX_RectF& rtInvalidate); 82 void RunDocClose(); 83 84 void ProcessValueChanged(CXFA_Node* node); 85 void SetChangeMark(); 86 87 void AddValidateNode(CXFA_Node* node); 88 void AddCalculateNodeNotify(CXFA_Node* pNodeChange); 89 void AddCalculateNode(CXFA_Node* node); 90 91 bool RunLayout(); 92 void AddNewFormNode(CXFA_Node* pNode); 93 void AddIndexChangedSubform(CXFA_Subform* pNode); GetFocusNode()94 CXFA_Node* GetFocusNode() const { return m_pFocusNode; } 95 void SetFocusNode(CXFA_Node* pNode); 96 void DeleteLayoutItem(CXFA_FFWidget* pWidget); 97 XFA_EventError ExecEventActivityByDeepFirst(CXFA_Node* pFormNode, 98 XFA_EVENTTYPE eEventType, 99 bool bIsFormReady, 100 bool bRecursive); 101 AddBindItem(CXFA_BindItems * item)102 void AddBindItem(CXFA_BindItems* item) { m_BindItems.push_back(item); } 103 void AddNullTestMsg(const WideString& msg); 104 105 private: 106 explicit CXFA_FFDocView(CXFA_FFDoc* pDoc); 107 108 bool RunEventLayoutReady(); 109 void RunBindItems(); 110 void InitCalculate(CXFA_Node* pNode); 111 void InitLayout(CXFA_Node* pNode); 112 size_t RunCalculateRecursive(size_t index); 113 void ShowNullTestMsg(); 114 bool ResetSingleNodeData(CXFA_Node* pNode); 115 IsUpdateLocked()116 bool IsUpdateLocked() const { return m_iLock > 0; } 117 bool InitValidate(CXFA_Node* pNode); 118 bool RunValidate(); 119 XFA_EventError RunCalculateWidgets(); 120 void RunSubformIndexChange(); 121 122 cppgc::Member<CXFA_FFDoc> const m_pDoc; 123 cppgc::Member<CXFA_FFWidgetHandler> m_pWidgetHandler; 124 cppgc::Member<CXFA_Node> m_pFocusNode; 125 cppgc::Member<CXFA_FFWidget> m_pFocusWidget; 126 std::list<cppgc::Member<CXFA_Node>> m_ValidateNodes; 127 std::vector<cppgc::Member<CXFA_Node>> m_CalculateNodes; 128 std::list<cppgc::Member<CXFA_BindItems>> m_BindItems; 129 std::list<cppgc::Member<CXFA_Node>> m_NewAddedNodes; 130 std::list<cppgc::Member<CXFA_Subform>> m_IndexChangedSubforms; 131 std::vector<WideString> m_NullTestMsgArray; 132 bool m_bLayoutEvent = false; 133 bool m_bInLayoutStatus = false; 134 LayoutStatus m_iStatus = LayoutStatus::kNone; 135 int32_t m_iLock = 0; 136 }; 137 138 #endif // XFA_FXFA_CXFA_FFDOCVIEW_H_ 139