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 _FXFA_FORMFILLER_WIDGET_IMP_H
8#define _FXFA_FORMFILLER_WIDGET_IMP_H
9
10#include "xfa/include/fxfa/fxfa.h"
11
12class CXFA_FFPageView;
13class CXFA_FFDocView;
14class CXFA_FFDoc;
15class CXFA_FFApp;
16
17#define XFA_GOTO_POSITION_IF_FAIL(arg, pos) \
18  {                                         \
19    if (!(arg))                             \
20      goto pos;                             \
21  }
22inline FX_FLOAT XFA_UnitPx2Pt(FX_FLOAT fPx, FX_FLOAT fDpi) {
23  return fPx * 72.0f / fDpi;
24}
25#define XFA_FLOAT_PERCISION 0.001f
26enum XFA_WIDGETITEM {
27  XFA_WIDGETITEM_Parent,
28  XFA_WIDGETITEM_FirstChild,
29  XFA_WIDGETITEM_NextSibling,
30  XFA_WIDGETITEM_PrevSibling,
31};
32class CXFA_CalcData {
33 public:
34  CXFA_CalcData() : m_iRefCount(0) {}
35  ~CXFA_CalcData() { m_Globals.RemoveAll(); }
36  CFX_PtrArray m_Globals;
37  int32_t m_iRefCount;
38};
39class CXFA_FFWidget : public IXFA_Widget,
40                      public CFX_PrivateData,
41                      public CXFA_ContentLayoutItem {
42 public:
43  CXFA_FFWidget(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
44  virtual ~CXFA_FFWidget();
45  IXFA_PageView* GetPageView();
46  void SetPageView(IXFA_PageView* pPageView);
47  void GetWidgetRect(CFX_RectF& rtWidget);
48  CFX_RectF ReCacheWidgetRect();
49  FX_DWORD GetStatus();
50  void ModifyStatus(FX_DWORD dwAdded, FX_DWORD dwRemoved);
51  virtual FX_BOOL GetBBox(CFX_RectF& rtBox,
52                          FX_DWORD dwStatus,
53                          FX_BOOL bDrawFocus = FALSE);
54  CXFA_WidgetAcc* GetDataAcc();
55  FX_BOOL GetToolTip(CFX_WideString& wsToolTip);
56  virtual void RenderWidget(CFX_Graphics* pGS,
57                            CFX_Matrix* pMatrix = NULL,
58                            FX_DWORD dwStatus = 0,
59                            int32_t iRotate = 0);
60
61  virtual FX_BOOL IsLoaded();
62  virtual FX_BOOL LoadWidget();
63  virtual void UnloadWidget();
64  virtual FX_BOOL PerformLayout();
65  virtual FX_BOOL UpdateFWLData();
66  virtual void UpdateWidgetProperty();
67  virtual FX_BOOL OnMouseEnter();
68  virtual FX_BOOL OnMouseExit();
69  virtual FX_BOOL OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
70  virtual FX_BOOL OnLButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
71  virtual FX_BOOL OnLButtonDblClk(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
72  virtual FX_BOOL OnMouseMove(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
73  virtual FX_BOOL OnMouseWheel(FX_DWORD dwFlags,
74                               int16_t zDelta,
75                               FX_FLOAT fx,
76                               FX_FLOAT fy);
77  virtual FX_BOOL OnRButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
78  virtual FX_BOOL OnRButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
79  virtual FX_BOOL OnRButtonDblClk(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
80
81  virtual FX_BOOL OnSetFocus(CXFA_FFWidget* pOldWidget);
82  virtual FX_BOOL OnKillFocus(CXFA_FFWidget* pNewWidget);
83  virtual FX_BOOL OnKeyDown(FX_DWORD dwKeyCode, FX_DWORD dwFlags);
84  virtual FX_BOOL OnKeyUp(FX_DWORD dwKeyCode, FX_DWORD dwFlags);
85  virtual FX_BOOL OnChar(FX_DWORD dwChar, FX_DWORD dwFlags);
86  virtual FX_DWORD OnHitTest(FX_FLOAT fx, FX_FLOAT fy);
87  virtual FX_BOOL OnSetCursor(FX_FLOAT fx, FX_FLOAT fy);
88  virtual FX_BOOL CanUndo() { return FALSE; }
89  virtual FX_BOOL CanRedo() { return FALSE; }
90  virtual FX_BOOL Undo() { return FALSE; }
91  virtual FX_BOOL Redo() { return FALSE; }
92  virtual FX_BOOL CanCopy() { return FALSE; }
93  virtual FX_BOOL CanCut() { return FALSE; }
94  virtual FX_BOOL CanPaste() { return FALSE; }
95  virtual FX_BOOL CanSelectAll() { return FALSE; }
96  virtual FX_BOOL CanDelete() { return CanCut(); }
97  virtual FX_BOOL CanDeSelect() { return CanCopy(); }
98  virtual FX_BOOL Copy(CFX_WideString& wsCopy) { return FALSE; }
99  virtual FX_BOOL Cut(CFX_WideString& wsCut) { return FALSE; }
100  virtual FX_BOOL Paste(const CFX_WideString& wsPaste) { return FALSE; }
101  virtual FX_BOOL SelectAll() { return FALSE; }
102  virtual FX_BOOL Delete() { return FALSE; }
103  virtual FX_BOOL DeSelect() { return FALSE; }
104  virtual FX_BOOL GetSuggestWords(CFX_PointF pointf,
105                                  CFX_ByteStringArray& sSuggest) {
106    return FALSE;
107  }
108  virtual FX_BOOL ReplaceSpellCheckWord(CFX_PointF pointf,
109                                        const CFX_ByteStringC& bsReplace) {
110    return FALSE;
111  }
112  CXFA_FFDocView* GetDocView();
113  void SetDocView(CXFA_FFDocView* pDocView) { m_pDocView = pDocView; }
114  CXFA_FFDoc* GetDoc();
115  CXFA_FFApp* GetApp();
116  IXFA_AppProvider* GetAppProvider();
117  void InvalidateWidget(const CFX_RectF* pRect = NULL);
118  void AddInvalidateRect(const CFX_RectF* pRect = NULL);
119  FX_BOOL GetCaptionText(CFX_WideString& wsCap);
120  FX_BOOL IsFocused();
121  void Rotate2Normal(FX_FLOAT& fx, FX_FLOAT& fy);
122  void GetRotateMatrix(CFX_Matrix& mt);
123  FX_BOOL IsLayoutRectEmpty();
124  CXFA_FFWidget* GetParent();
125  FX_BOOL IsAncestorOf(CXFA_FFWidget* pWidget);
126
127 protected:
128  virtual FX_BOOL PtInActiveRect(FX_FLOAT fx, FX_FLOAT fy);
129  void DrawBorder(CFX_Graphics* pGS,
130                  CXFA_Box box,
131                  const CFX_RectF& rtBorder,
132                  CFX_Matrix* pMatrix,
133                  FX_DWORD dwFlags = 0);
134  void GetMinMaxWidth(FX_FLOAT fMinWidth, FX_FLOAT fMaxWidth);
135  void GetMinMaxHeight(FX_FLOAT fMinHeight, FX_FLOAT fMaxHeight);
136  void GetRectWithoutRotate(CFX_RectF& rtWidget);
137  FX_BOOL IsMatchVisibleStatus(FX_DWORD dwStatus);
138
139  void EventKillFocus();
140  FX_BOOL IsButtonDown();
141  void SetButtonDown(FX_BOOL bSet);
142  CXFA_FFDocView* m_pDocView;
143  CXFA_FFPageView* m_pPageView;
144  CXFA_WidgetAcc* m_pDataAcc;
145  CFX_RectF m_rtWidget;
146};
147int32_t XFA_StrokeTypeSetLineDash(CFX_Graphics* pGraphics,
148                                  int32_t iStrokeType,
149                                  int32_t iCapType);
150CFX_GraphStateData::LineCap XFA_LineCapToFXGE(int32_t iLineCap);
151void XFA_DrawImage(CFX_Graphics* pGS,
152                   const CFX_RectF& rtImage,
153                   CFX_Matrix* pMatrix,
154                   CFX_DIBitmap* pDIBitmap,
155                   int32_t iAspect,
156                   int32_t iImageXDpi,
157                   int32_t iImageYDpi,
158                   int32_t iHorzAlign = XFA_ATTRIBUTEENUM_Left,
159                   int32_t iVertAlign = XFA_ATTRIBUTEENUM_Top);
160CFX_DIBitmap* XFA_LoadImageData(CXFA_FFDoc* pDoc,
161                                CXFA_Image* pImage,
162                                FX_BOOL& bNameImage,
163                                int32_t& iImageXDpi,
164                                int32_t& iImageYDpi);
165CFX_DIBitmap* XFA_LoadImageFromBuffer(IFX_FileRead* pImageFileRead,
166                                      FXCODEC_IMAGE_TYPE type,
167                                      int32_t& iImageXDpi,
168                                      int32_t& iImageYDpi);
169FXCODEC_IMAGE_TYPE XFA_GetImageType(const CFX_WideStringC& wsType);
170FX_CHAR* XFA_Base64Encode(const uint8_t* buf, int32_t buf_len);
171void XFA_RectWidthoutMargin(CFX_RectF& rt,
172                            const CXFA_Margin& mg,
173                            FX_BOOL bUI = FALSE);
174FX_FLOAT XFA_GetEdgeThickness(const CXFA_StrokeArray& strokes,
175                              FX_BOOL b3DStyle,
176                              int32_t nIndex);
177CXFA_FFWidget* XFA_GetWidgetFromLayoutItem(CXFA_LayoutItem* pLayoutItem);
178FX_BOOL XFA_IsCreateWidget(XFA_ELEMENT iType);
179#define XFA_DRAWBOX_ForceRound 1
180#define XFA_DRAWBOX_Lowered3D 2
181void XFA_DrawBox(CXFA_Box box,
182                 CFX_Graphics* pGS,
183                 const CFX_RectF& rtWidget,
184                 CFX_Matrix* pMatrix,
185                 FX_DWORD dwFlags = 0);
186#endif
187