• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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