1// Copyright 2014 PDFium Authors. All rights reserved.
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_DOCLAYOUT_H_
8#define _XFA_DOCLAYOUT_H_
9#define _XFA_LAYOUTITEM_ProcessCACHE_
10
11class CXFA_ContainerLayoutItem;
12class CXFA_ContentLayoutItem;
13
14class IXFA_LayoutPage {
15 public:
16  virtual ~IXFA_LayoutPage() {}
17  virtual IXFA_DocLayout* GetLayout() const = 0;
18  virtual int32_t GetPageIndex() const = 0;
19  virtual void GetPageSize(CFX_SizeF& size) = 0;
20  virtual CXFA_Node* GetMasterPage() const = 0;
21};
22
23class CXFA_LayoutItem {
24 public:
25  virtual ~CXFA_LayoutItem();
26
27  FX_BOOL IsContainerLayoutItem() const { return !m_bIsContentLayoutItem; }
28  FX_BOOL IsContentLayoutItem() const { return m_bIsContentLayoutItem; }
29  inline CXFA_ContainerLayoutItem* AsContainerLayoutItem();
30  inline CXFA_ContentLayoutItem* AsContentLayoutItem();
31
32  IXFA_LayoutPage* GetPage() const;
33  CXFA_Node* GetFormNode() const;
34  void GetRect(CFX_RectF& rtLayout, FX_BOOL bRelative = FALSE) const;
35  int32_t GetIndex() const;
36  int32_t GetCount() const;
37  CXFA_LayoutItem* GetParent() const;
38  const CXFA_LayoutItem* GetFirst() const;
39  CXFA_LayoutItem* GetFirst();
40  const CXFA_LayoutItem* GetLast() const;
41  CXFA_LayoutItem* GetLast();
42  CXFA_LayoutItem* GetPrev() const;
43  CXFA_LayoutItem* GetNext() const;
44
45  void AddChild(CXFA_LayoutItem* pChildItem);
46  void AddHeadChild(CXFA_LayoutItem* pChildItem);
47  void RemoveChild(CXFA_LayoutItem* pChildItem);
48  void InsertChild(CXFA_LayoutItem* pBeforeItem, CXFA_LayoutItem* pChildItem);
49
50  CXFA_Node* m_pFormNode;
51  CXFA_LayoutItem* m_pParent;
52  CXFA_LayoutItem* m_pNextSibling;
53  CXFA_LayoutItem* m_pFirstChild;
54
55 protected:
56  CXFA_LayoutItem(CXFA_Node* pNode, FX_BOOL bIsContentLayoutItem);
57
58  FX_BOOL m_bIsContentLayoutItem;
59};
60
61class CXFA_ContainerLayoutItem : public CXFA_LayoutItem,
62                                 public IXFA_LayoutPage {
63 public:
64  CXFA_ContainerLayoutItem(CXFA_Node* pNode);
65
66  // IXFA_LayoutPage:
67  IXFA_DocLayout* GetLayout() const override;
68  int32_t GetPageIndex() const override;
69  void GetPageSize(CFX_SizeF& size) override;
70  CXFA_Node* GetMasterPage() const override;
71
72  CXFA_Node* m_pOldSubform;
73};
74
75#define XFA_WIDGETSTATUS_Access 0x80000000
76#define XFA_WIDGETSTATUS_Disabled 0x40000000
77#define XFA_WIDGETSTATUS_RectCached 0x20000000
78#define XFA_WIDGETSTATUS_ButtonDown 0x10000000
79#define XFA_WIDGETSTATUS_Highlight 0x08000000
80#define XFA_WIDGETSTATUS_TextEditValueChanged 0x04000000
81
82class CXFA_ContentLayoutItem : public CXFA_LayoutItem {
83 public:
84  CXFA_ContentLayoutItem(CXFA_Node* pNode);
85  virtual ~CXFA_ContentLayoutItem();
86
87  CXFA_ContentLayoutItem* m_pPrev;
88  CXFA_ContentLayoutItem* m_pNext;
89  CFX_PointF m_sPos;
90  CFX_SizeF m_sSize;
91  FX_DWORD m_dwStatus;
92};
93
94CXFA_ContainerLayoutItem* CXFA_LayoutItem::AsContainerLayoutItem() {
95  return IsContainerLayoutItem() ? static_cast<CXFA_ContainerLayoutItem*>(this)
96                                 : nullptr;
97}
98CXFA_ContentLayoutItem* CXFA_LayoutItem::AsContentLayoutItem() {
99  return IsContentLayoutItem() ? static_cast<CXFA_ContentLayoutItem*>(this)
100                               : nullptr;
101}
102inline CXFA_ContainerLayoutItem* ToContainerLayoutItem(CXFA_LayoutItem* pItem) {
103  return pItem ? pItem->AsContainerLayoutItem() : nullptr;
104}
105inline CXFA_ContentLayoutItem* ToContentLayoutItem(CXFA_LayoutItem* pItem) {
106  return pItem ? pItem->AsContentLayoutItem() : nullptr;
107}
108
109class CXFA_TraverseStrategy_LayoutItem {
110 public:
111  static inline CXFA_LayoutItem* GetFirstChild(CXFA_LayoutItem* pLayoutItem) {
112    return pLayoutItem->m_pFirstChild;
113  }
114  static inline CXFA_LayoutItem* GetNextSibling(CXFA_LayoutItem* pLayoutItem) {
115    return pLayoutItem->m_pNextSibling;
116  }
117  static inline CXFA_LayoutItem* GetParent(CXFA_LayoutItem* pLayoutItem) {
118    return pLayoutItem->m_pParent;
119  }
120};
121
122class IXFA_DocLayout {
123 public:
124  virtual ~IXFA_DocLayout() {}
125  virtual CXFA_Document* GetDocument() const = 0;
126  virtual int32_t StartLayout(FX_BOOL bForceRestart = FALSE) = 0;
127  virtual int32_t DoLayout(IFX_Pause* pPause = NULL) = 0;
128  virtual FX_BOOL IncrementLayout() = 0;
129  virtual int32_t CountPages() const = 0;
130  virtual IXFA_LayoutPage* GetPage(int32_t index) const = 0;
131  virtual CXFA_LayoutItem* GetLayoutItem(CXFA_Node* pFormItem) = 0;
132};
133#endif
134