|  | // Copyright 2014 PDFium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 
|  |  | 
|  | #ifndef XFA_FXFA_INCLUDE_XFA_FFDOCVIEW_H_ | 
|  | #define XFA_FXFA_INCLUDE_XFA_FFDOCVIEW_H_ | 
|  |  | 
|  | #include <map> | 
|  | #include <memory> | 
|  |  | 
|  | #include "xfa/fxfa/include/cxfa_eventparam.h" | 
|  | #include "xfa/fxfa/include/xfa_ffdoc.h" | 
|  |  | 
|  | class CXFA_FFWidgetHandler; | 
|  | class CXFA_FFDoc; | 
|  | class CXFA_FFWidget; | 
|  | class CXFA_WidgetAccIterator; | 
|  |  | 
|  | extern const XFA_ATTRIBUTEENUM gs_EventActivity[]; | 
|  | enum XFA_DOCVIEW_LAYOUTSTATUS { | 
|  | XFA_DOCVIEW_LAYOUTSTATUS_None, | 
|  | XFA_DOCVIEW_LAYOUTSTATUS_Start, | 
|  | XFA_DOCVIEW_LAYOUTSTATUS_FormInitialize, | 
|  | XFA_DOCVIEW_LAYOUTSTATUS_FormInitCalculate, | 
|  | XFA_DOCVIEW_LAYOUTSTATUS_FormInitValidate, | 
|  | XFA_DOCVIEW_LAYOUTSTATUS_FormFormReady, | 
|  | XFA_DOCVIEW_LAYOUTSTATUS_Doing, | 
|  | XFA_DOCVIEW_LAYOUTSTATUS_PagesetInitialize, | 
|  | XFA_DOCVIEW_LAYOUTSTATUS_PagesetInitCalculate, | 
|  | XFA_DOCVIEW_LAYOUTSTATUS_PagesetInitValidate, | 
|  | XFA_DOCVIEW_LAYOUTSTATUS_PagesetFormReady, | 
|  | XFA_DOCVIEW_LAYOUTSTATUS_LayoutReady, | 
|  | XFA_DOCVIEW_LAYOUTSTATUS_DocReady, | 
|  | XFA_DOCVIEW_LAYOUTSTATUS_End | 
|  | }; | 
|  | class CXFA_FFDocView { | 
|  | public: | 
|  | CXFA_FFDocView(CXFA_FFDoc* pDoc); | 
|  | ~CXFA_FFDocView(); | 
|  |  | 
|  | CXFA_FFDoc* GetDoc() { return m_pDoc; } | 
|  | int32_t StartLayout(int32_t iStartPage = 0); | 
|  | int32_t DoLayout(IFX_Pause* pPause = nullptr); | 
|  | void StopLayout(); | 
|  | int32_t GetLayoutStatus(); | 
|  | void UpdateDocView(); | 
|  | int32_t CountPageViews(); | 
|  | CXFA_FFPageView* GetPageView(int32_t nIndex); | 
|  |  | 
|  | void ResetWidgetData(CXFA_WidgetAcc* pWidgetAcc = nullptr); | 
|  | int32_t ProcessWidgetEvent(CXFA_EventParam* pParam, | 
|  | CXFA_WidgetAcc* pWidgetAcc = nullptr); | 
|  | CXFA_FFWidgetHandler* GetWidgetHandler(); | 
|  | CXFA_WidgetAccIterator* CreateWidgetAccIterator( | 
|  | XFA_WIDGETORDER eOrder = XFA_WIDGETORDER_PreOrder); | 
|  | CXFA_FFWidget* GetFocusWidget(); | 
|  | void KillFocus(); | 
|  | FX_BOOL SetFocus(CXFA_FFWidget* hWidget); | 
|  | CXFA_FFWidget* GetWidgetByName(const CFX_WideString& wsName, | 
|  | CXFA_FFWidget* pRefWidget = nullptr); | 
|  | CXFA_WidgetAcc* GetWidgetAccByName(const CFX_WideString& wsName, | 
|  | CXFA_WidgetAcc* pRefWidgetAcc = nullptr); | 
|  | CXFA_LayoutProcessor* GetXFALayout() const; | 
|  | void OnPageEvent(CXFA_ContainerLayoutItem* pSender, uint32_t dwEvent); | 
|  | void LockUpdate(); | 
|  | void UnlockUpdate(); | 
|  | FX_BOOL IsUpdateLocked(); | 
|  | void ClearInvalidateList(); | 
|  | void AddInvalidateRect(CXFA_FFWidget* pWidget, const CFX_RectF& rtInvalidate); | 
|  | void AddInvalidateRect(CXFA_FFPageView* pPageView, | 
|  | const CFX_RectF& rtInvalidate); | 
|  | void RunInvalidate(); | 
|  | void RunDocClose(); | 
|  | void DestroyDocView(); | 
|  |  | 
|  | FX_BOOL InitValidate(CXFA_Node* pNode); | 
|  | FX_BOOL RunValidate(); | 
|  |  | 
|  | void SetChangeMark(); | 
|  |  | 
|  | void AddValidateWidget(CXFA_WidgetAcc* pWidget); | 
|  | void AddCalculateNodeNotify(CXFA_Node* pNodeChange); | 
|  | void AddCalculateWidgetAcc(CXFA_WidgetAcc* pWidgetAcc); | 
|  | int32_t RunCalculateWidgets(); | 
|  | FX_BOOL IsStaticNotify(); | 
|  | FX_BOOL RunLayout(); | 
|  | void RunSubformIndexChange(); | 
|  | void AddNewFormNode(CXFA_Node* pNode); | 
|  | void AddIndexChangedSubform(CXFA_Node* pNode); | 
|  | CXFA_WidgetAcc* GetFocusWidgetAcc(); | 
|  | void SetFocusWidgetAcc(CXFA_WidgetAcc* pWidgetAcc); | 
|  | void DeleteLayoutItem(CXFA_FFWidget* pWidget); | 
|  | int32_t ExecEventActivityByDeepFirst(CXFA_Node* pFormNode, | 
|  | XFA_EVENTTYPE eEventType, | 
|  | FX_BOOL bIsFormReady = FALSE, | 
|  | FX_BOOL bRecursive = TRUE, | 
|  | CXFA_Node* pExclude = nullptr); | 
|  | FX_BOOL m_bLayoutEvent; | 
|  | CFX_WideStringArray m_arrNullTestMsg; | 
|  | CXFA_FFWidget* m_pListFocusWidget; | 
|  | FX_BOOL m_bInLayoutStatus; | 
|  |  | 
|  | protected: | 
|  | FX_BOOL RunEventLayoutReady(); | 
|  | void RunBindItems(); | 
|  | FX_BOOL InitCalculate(CXFA_Node* pNode); | 
|  | void InitLayout(CXFA_Node* pNode); | 
|  | void RunCalculateRecursive(int32_t& iIndex); | 
|  | void ShowNullTestMsg(); | 
|  | FX_BOOL ResetSingleWidgetAccData(CXFA_WidgetAcc* pWidgetAcc); | 
|  | CXFA_Node* GetRootSubform(); | 
|  |  | 
|  | CXFA_FFDoc* m_pDoc; | 
|  | CXFA_FFWidgetHandler* m_pWidgetHandler; | 
|  | CXFA_LayoutProcessor* m_pXFADocLayout; | 
|  | CXFA_WidgetAcc* m_pFocusAcc; | 
|  | CXFA_FFWidget* m_pFocusWidget; | 
|  | CXFA_FFWidget* m_pOldFocusWidget; | 
|  | std::map<CXFA_FFPageView*, std::unique_ptr<CFX_RectF>> m_mapPageInvalidate; | 
|  | CFX_ArrayTemplate<CXFA_WidgetAcc*> m_ValidateAccs; | 
|  | CFX_ArrayTemplate<CXFA_WidgetAcc*> m_CalculateAccs; | 
|  | CFX_ArrayTemplate<CXFA_Node*> m_BindItems; | 
|  | CFX_ArrayTemplate<CXFA_Node*> m_NewAddedNodes; | 
|  | CFX_ArrayTemplate<CXFA_Node*> m_IndexChangedSubforms; | 
|  | XFA_DOCVIEW_LAYOUTSTATUS m_iStatus; | 
|  | int32_t m_iLock; | 
|  | friend class CXFA_FFNotify; | 
|  | }; | 
|  |  | 
|  | class CXFA_WidgetAccIterator { | 
|  | public: | 
|  | CXFA_WidgetAccIterator(CXFA_FFDocView* pDocView, CXFA_Node* pTravelRoot); | 
|  | ~CXFA_WidgetAccIterator(); | 
|  |  | 
|  | void Reset(); | 
|  | CXFA_WidgetAcc* MoveToFirst(); | 
|  | CXFA_WidgetAcc* MoveToLast(); | 
|  | CXFA_WidgetAcc* MoveToNext(); | 
|  | CXFA_WidgetAcc* MoveToPrevious(); | 
|  | CXFA_WidgetAcc* GetCurrentWidgetAcc(); | 
|  | FX_BOOL SetCurrentWidgetAcc(CXFA_WidgetAcc* hWidget); | 
|  | void SkipTree(); | 
|  |  | 
|  | protected: | 
|  | CXFA_ContainerIterator m_ContentIterator; | 
|  | CXFA_FFDocView* m_pDocView; | 
|  | CXFA_WidgetAcc* m_pCurWidgetAcc; | 
|  | }; | 
|  |  | 
|  | #endif  // XFA_FXFA_INCLUDE_XFA_FFDOCVIEW_H_ |