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